diff --git a/pages/memgraph-zero.mdx b/pages/memgraph-zero.mdx
index 8c20f64f7..d81a296ad 100644
--- a/pages/memgraph-zero.mdx
+++ b/pages/memgraph-zero.mdx
@@ -3,6 +3,7 @@ title: Memgraph Zero
description: Zero ETL. Query data where it lives.
---
+import { Callout } from 'nextra/components'
import MemGQLAnimation from '/components/animations/memgql'
# Memgraph Zero
@@ -21,6 +22,11 @@ intelligence without the engineering tax of maintaining another data pipeline.
+
+ Help shape the Memgraph Zero roadmap — [share your feedback in our short
+ survey](https://forms.gle/2MLfWp24uwbJpsey8).
+
+
## Powered by MemGQL
The first component of Memgraph Zero is **[MemGQL](/memgraph-zero/memgql)**, a
diff --git a/pages/memgraph-zero/memgql.mdx b/pages/memgraph-zero/memgql.mdx
index dc61755f8..7c05326d7 100644
--- a/pages/memgraph-zero/memgql.mdx
+++ b/pages/memgraph-zero/memgql.mdx
@@ -3,6 +3,11 @@ title: MemGQL
description: MemGQL documentation and reference.
---
+import { SocialCards } from '/components/social-card/SocialCards';
+import { SocialCard } from '/components/social-card/SocialCard';
+import Discord from '/components/icons/Discord';
+import GitHub from '/components/icons/GitHub';
+
# MemGQL
MemGQL is a federated GQL ([ISO/IEC
@@ -30,5 +35,35 @@ details. Review the [Licensing](/memgraph-zero/memgql/licensing) information for
of use, and check the [Changelog](/memgraph-zero/memgql/changelog) to stay updated on
the latest improvements.
+## Questions & Feedback
+
+Have questions or want to share feedback? We'd love to hear from you!
+
+
+ }
+ title="Discord"
+ body="Chat with the community"
+ href="https://discord.gg/memgraph"
+ is_external={true}
+ />
+ }
+ title="GitHub Issues"
+ body="Report bugs or request features"
+ href="https://github.com/memgraph/memgraph/issues"
+ is_external={true}
+ />
+ }
+ title="GitHub Discussions"
+ body="Start longer form discussions"
+ href="https://github.com/memgraph/memgraph/discussions"
+ is_external={true}
+ />
+
+
+## MemGQL Enterprise
+
Interested in MemGQL Enterprise? [Get in
touch](https://memgraph.com/contact-us) with our team to learn more.
diff --git a/pages/memgraph-zero/memgql/changelog.mdx b/pages/memgraph-zero/memgql/changelog.mdx
index d6df13e6d..349caecd4 100644
--- a/pages/memgraph-zero/memgql/changelog.mdx
+++ b/pages/memgraph-zero/memgql/changelog.mdx
@@ -5,6 +5,17 @@ description: MemGQL release notes
# MemGQL Changelog
+## MemGQL v0.4.0 - May 7th, 2026
+
+- Added "Federated GQL Across Heterogeneous Backends" use case showing graph queries over ClickHouse and PostgreSQL
+- Added vector search capabilities (only Memgraph backend)
+- Fixed `SET DEFAULT CONNECTION` handling
+- Fixed flaky `USE graph` behavior and corrected `USE graph` routing
+- Fixed multi node and edge SQL `INSERT`
+- Fixed connection handling
+- Improved Trino startup wait
+- Fixed all tests under `run_tests.sh`
+
## MemGQL v0.3.0 - April 26th, 2026
- Added Apache Pinot connector support, including `CONNECTION_TYPE=pinot` single mode and multi-connection mode
diff --git a/pages/memgraph-zero/memgql/complete.mdx b/pages/memgraph-zero/memgql/complete.mdx
index 0d708947c..e5bd0d537 100644
--- a/pages/memgraph-zero/memgql/complete.mdx
+++ b/pages/memgraph-zero/memgql/complete.mdx
@@ -101,7 +101,7 @@ Save the following as `docker-compose.yml`:
```yaml
services:
memgql:
- image: memgraph/memgql:0.3.0
+ image: memgraph/memgql:0.4.0
container_name: memgql
ports:
- "7688:7688"
diff --git a/pages/memgraph-zero/memgql/connect/_meta.ts b/pages/memgraph-zero/memgql/connect/_meta.ts
index e558b5ac4..8af369f6a 100644
--- a/pages/memgraph-zero/memgql/connect/_meta.ts
+++ b/pages/memgraph-zero/memgql/connect/_meta.ts
@@ -5,4 +5,6 @@ export default {
"memgraph": "to Memgraph",
"neo4j": "to Neo4j",
"postgres": "to PostgreSQL",
+ "mysql": "to MySQL",
+ "pinot": "to Pinot",
}
diff --git a/pages/memgraph-zero/memgql/connect/clickhouse.mdx b/pages/memgraph-zero/memgql/connect/clickhouse.mdx
index bfe3f92e7..34572741c 100644
--- a/pages/memgraph-zero/memgql/connect/clickhouse.mdx
+++ b/pages/memgraph-zero/memgql/connect/clickhouse.mdx
@@ -95,4 +95,4 @@ MATCH (p:Person)-[:WORKS_AT]->(c:Company) RETURN p.name, c.name;
MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name;
```
-For environment variables, see [Configuration](../config.mdx#clickhouse-clickhouse).
+For environment variables, see [Reference](../reference.mdx#clickhouse-clickhouse).
diff --git a/pages/memgraph-zero/memgql/connect/duckdb.mdx b/pages/memgraph-zero/memgql/connect/duckdb.mdx
index 0e1ee66ac..67dec8cb6 100644
--- a/pages/memgraph-zero/memgql/connect/duckdb.mdx
+++ b/pages/memgraph-zero/memgql/connect/duckdb.mdx
@@ -73,4 +73,4 @@ MATCH (p:Person)-[:WORKS_AT]->(c:Company) RETURN p.name, c.name;
MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name;
```
-For environment variables, see [Configuration](../config.mdx#duckdb-duckdb).
+For environment variables, see [Reference](../reference.mdx#duckdb-duckdb).
diff --git a/pages/memgraph-zero/memgql/connect/iceberg.mdx b/pages/memgraph-zero/memgql/connect/iceberg.mdx
index f30e1808f..aada9077e 100644
--- a/pages/memgraph-zero/memgql/connect/iceberg.mdx
+++ b/pages/memgraph-zero/memgql/connect/iceberg.mdx
@@ -93,4 +93,4 @@ MATCH (p:Person)-[:WORKS_AT]->(c:Company) RETURN p.name, c.name;
MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name;
```
-For environment variables, see [Configuration](../config.mdx#iceberg-iceberg).
+For environment variables, see [Reference](../reference.mdx#iceberg-iceberg).
diff --git a/pages/memgraph-zero/memgql/connect/memgraph.mdx b/pages/memgraph-zero/memgql/connect/memgraph.mdx
index ee1b4f535..b16f4ee4b 100644
--- a/pages/memgraph-zero/memgql/connect/memgraph.mdx
+++ b/pages/memgraph-zero/memgql/connect/memgraph.mdx
@@ -70,4 +70,4 @@ MATCH (p:Person)-[:WORKS_AT]->(c:Company) RETURN p.name, c.name;
MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name;
```
-For environment variables, see [Configuration](../config.mdx#memgraph-memgraph-memgraph-gql).
+For environment variables, see [Reference](../reference.mdx#memgraph-memgraph-memgraph-gql).
diff --git a/pages/memgraph-zero/memgql/connect/mysql.mdx b/pages/memgraph-zero/memgql/connect/mysql.mdx
index 4217dd682..5027a423a 100644
--- a/pages/memgraph-zero/memgql/connect/mysql.mdx
+++ b/pages/memgraph-zero/memgql/connect/mysql.mdx
@@ -104,4 +104,4 @@ MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name;
- Aliased single-table `DELETE` is emitted as the multi-table form
`DELETE alias FROM table AS alias WHERE …` (MySQL 8.0+ requirement).
-For environment variables, see [Configuration](../config.mdx#mysql-mysql).
+For environment variables, see [Reference](../reference.mdx#mysql-mysql).
diff --git a/pages/memgraph-zero/memgql/connect/neo4j.mdx b/pages/memgraph-zero/memgql/connect/neo4j.mdx
index e3b93a0a2..1977845d3 100644
--- a/pages/memgraph-zero/memgql/connect/neo4j.mdx
+++ b/pages/memgraph-zero/memgql/connect/neo4j.mdx
@@ -73,4 +73,4 @@ MATCH (p:Person)-[:WORKS_AT]->(c:Company) RETURN p.name, c.name;
MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name;
```
-For environment variables, see [Configuration](../config.mdx#neo4j-neo4j-neo4j-gql).
+For environment variables, see [Reference](../reference.mdx#neo4j-neo4j-neo4j-gql).
diff --git a/pages/memgraph-zero/memgql/connect/pinot.mdx b/pages/memgraph-zero/memgql/connect/pinot.mdx
index 0f0f08585..21688e425 100644
--- a/pages/memgraph-zero/memgql/connect/pinot.mdx
+++ b/pages/memgraph-zero/memgql/connect/pinot.mdx
@@ -93,4 +93,4 @@ MATCH (p:Person)-[:WORKS_AT]->(c:Company) RETURN p.name, c.name;
MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name;
```
-For environment variables, see [Configuration](../config.mdx#apache-pinot-pinot).
+For environment variables, see [Reference](../reference.mdx#apache-pinot-pinot).
diff --git a/pages/memgraph-zero/memgql/connect/postgres.mdx b/pages/memgraph-zero/memgql/connect/postgres.mdx
index af42af918..ff6ac6656 100644
--- a/pages/memgraph-zero/memgql/connect/postgres.mdx
+++ b/pages/memgraph-zero/memgql/connect/postgres.mdx
@@ -88,4 +88,4 @@ MATCH (p:Person)-[:WORKS_AT]->(c:Company) RETURN p.name, c.name;
MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name;
```
-For environment variables, see [Configuration](../config.mdx#postgresql-postgres).
+For environment variables, see [Reference](../reference.mdx#postgresql-postgres).
diff --git a/pages/memgraph-zero/memgql/features.mdx b/pages/memgraph-zero/memgql/features.mdx
index 7fd3d32fb..5062367dd 100644
--- a/pages/memgraph-zero/memgql/features.mdx
+++ b/pages/memgraph-zero/memgql/features.mdx
@@ -20,8 +20,8 @@ description: MemGQL Community and Enterprise feature comparison.
| [MySQL](/memgraph-zero/memgql/connect/mysql) | Yes | Yes |
| [Pinot](/memgraph-zero/memgql/connect/pinot) | Yes | Yes |
| **Multi-Connection Mode** | Yes | Yes |
-| Max connectors | 4 | Unlimited |
-| Max simultaneous connections | 4 | Unlimited |
+| Max connectors | 2 | Unlimited |
+| Max simultaneous connections | 2 | Unlimited |
| **Agentic Capabilities** | | |
| MCP Server | Yes | Yes |
| Structured2Graph Agent to create mappings | Yes | Yes |
diff --git a/pages/memgraph-zero/memgql/reference.mdx b/pages/memgraph-zero/memgql/reference.mdx
index 07555ae4c..a18187910 100644
--- a/pages/memgraph-zero/memgql/reference.mdx
+++ b/pages/memgraph-zero/memgql/reference.mdx
@@ -3,7 +3,7 @@ title: Reference
description: All the details about syntax and various configs
---
-## Graph Management
+## Graph Management Query Syntax
```
ADD GRAPH ON CONNECTOR
@@ -26,28 +26,19 @@ ALTER GRAPH SET MAPPING ;
ALTER GRAPH REMOVE MAPPING;
```
-## Query Syntax
-
```
-- Single graph
USE ;
--- Focused multi-graph
-USE
-USE
-RETURN ...;
-
-- Composite
USE
UNION | UNION ALL | INTERSECT | INTERSECT ALL | EXCEPT | EXCEPT ALL
USE ;
```
-# Configuration Reference
-
-MemGQL is configured entirely via environment variables.
+## Configuration Reference
-## General
+### General
| Variable | Default | Description |
|--------------------|---------------------|--------------------------------------|
@@ -55,7 +46,35 @@ MemGQL is configured entirely via environment variables.
| `CONNECTION_TYPE` | _(none)_ | Alias for `CONNECTOR_TYPE` |
| `BOLT_LISTEN_ADDR` | `127.0.0.1:7688` | Address the Bolt server binds to |
-## Enterprise License
+### Logging
+
+MemGQL writes log lines to the console (stdout/stderr) and, in parallel, to a
+log file. Both destinations are configured via CLI flags on the Bolt server
+binary.
+
+#### CLI Flags
+
+| Flag | Default | Description |
+|------------------------|--------------------|--------------------------------------------------------------|
+| `--log-level=` | `info` | Console logging verbosity (see levels below) |
+| `--log-file=` | `bolt_server.log` | File to mirror all log output to (always written, regardless of `--log-level`) |
+
+#### Log Levels
+
+| Level | Console output |
+|----------------------|---------------------------------------------------------------------------------|
+| `info` | Full logging: connections, incoming queries, transpiled output, results, state changes |
+| `info-queries-only` | Only the incoming GQL query and its transpiled output (Cypher / SQL) |
+
+`info` is the most verbose level today. There is no `debug` or `trace`. The
+`RUST_LOG` environment variable is not consulted.
+
+The log file always receives every log line — including queries, errors, and
+state changes — independent of the console `--log-level`. To silence the
+console while keeping a full file record, use `--log-level=info-queries-only`
+and tail the log file separately.
+
+### Enterprise License
| Variable | Default | Description |
|-------------------------------|---------|------------------------------------------|
@@ -64,10 +83,10 @@ MemGQL is configured entirely via environment variables.
When set, the license is decoded and verified against the organization name at
startup. A valid enterprise license removes connector and connection limits.
-Without a license, community mode allows up to 4 connectors and 4 simultaneous
+Without a license, community mode allows up to 2 connectors and 2 simultaneous
connections.
-## Connector Types
+### Connector Types
| Connector | Translation | Backend |
|----------------|--------------------|----------------------------------|
@@ -83,7 +102,7 @@ connections.
| `pinot` | GQL -> SQL | Apache Pinot |
| `multi` | Per-connector | Multiple backends simultaneously |
-## Memgraph (`memgraph`, `memgraph-gql`)
+#### Memgraph (`memgraph`, `memgraph-gql`)
| Variable | Default | Description |
|-----------------|------------------|----------------|
@@ -92,7 +111,7 @@ connections.
| `MEMGRAPH_PASS` | `pass` | Password |
| `MEMGRAPH_DB` | `memgraph` | Database name |
-## Neo4j (`neo4j`, `neo4j-gql`)
+#### Neo4j (`neo4j`, `neo4j-gql`)
| Variable | Default | Description |
|--------------|------------------|----------------|
@@ -101,28 +120,28 @@ connections.
| `NEO4J_PASS` | `password` | Password |
| `NEO4J_DB` | `neo4j` | Database name |
-## PostgreSQL (`postgres`)
+#### PostgreSQL (`postgres`)
| Variable | Default | Description |
|----------------|-----------------------------------------------------------------|---------------------------|
| `POSTGRES_URL` | `host=localhost user=postgres password=postgres dbname=postgres` | libpq connection string |
| `MAPPING_FILE` | _(none, uses built-in default)_ | Path to JSON mapping file |
-## MySQL (`mysql`)
+#### MySQL (`mysql`)
| Variable | Default | Description |
|----------------|-----------------------------------------------|------------------------------------------|
| `MYSQL_URL` | `mysql://root:mysql@localhost:3306/test` | MySQL connection URL (`mysql://user:pass@host:port/database`) |
| `MAPPING_FILE` | _(none, uses built-in default)_ | Path to JSON mapping file |
-## DuckDB (`duckdb`)
+#### DuckDB (`duckdb`)
| Variable | Default | Description |
|----------------|---------------------------------|---------------------------|
| `DUCKDB_PATH` | `:memory:` | Path to DuckDB file |
| `MAPPING_FILE` | _(none, uses built-in default)_ | Path to JSON mapping file |
-## ClickHouse (`clickhouse`)
+#### ClickHouse (`clickhouse`)
| Variable | Default | Description |
|-------------------|---------------------------|---------------------------|
@@ -132,7 +151,7 @@ connections.
| `CLICKHOUSE_DB` | `default` | ClickHouse database |
| `MAPPING_FILE` | _(none, uses built-in default)_ | Path to JSON mapping file |
-## Apache Pinot (`pinot`)
+#### Apache Pinot (`pinot`)
| Variable | Default | Description |
|-----------------------|----------------------------|--------------------------------------------------|
@@ -140,7 +159,7 @@ connections.
| `PINOT_QUERY_OPTIONS` | `useMultistageEngine=true` | Query options sent with broker SQL requests |
| `MAPPING_FILE` | _(none, uses built-in default)_ | Path to JSON mapping file |
-## Iceberg (`iceberg`)
+#### Iceberg (`iceberg`)
| Variable | Default | Description |
|-----------------|-------------------------|---------------------------|
diff --git a/pages/memgraph-zero/memgql/use-cases.mdx b/pages/memgraph-zero/memgql/use-cases.mdx
index f582b17a5..0d48576e8 100644
--- a/pages/memgraph-zero/memgql/use-cases.mdx
+++ b/pages/memgraph-zero/memgql/use-cases.mdx
@@ -10,26 +10,33 @@ across systems, silos, and compliance boundaries. Each use case below shows a
real pattern, explains the architecture, and provides a working example you can
run yourself.
-## [Public-Private Data / Hybrid Graphs / Data Sovereignty](/memgraph-zero/memgql/use-cases/public-private)
+## [Federated GQL Across Heterogeneous Backends](/memgraph-zero/memgql/use-cases/federated-gql)
+
+Run graph queries across non-graph stores like ClickHouse and PostgreSQL
+through a single GQL endpoint. Tables become nodes and edges through a mapping
+file; cross-store joins, pattern matching, and variable-length paths work
+without ETL or schema changes.
+
+## [Public-Private Data / Data Sovereignty](/memgraph-zero/memgql/use-cases/public-private)
Keep sensitive data sovereign while querying it alongside public knowledge
graphs. A GDPR-compliant PostgreSQL database stores private customer profiles,
while a public Memgraph instance hosts the open product catalog. MemGQL joins
both from a single query endpoint without ever moving the regulated data.
-## [Enterprise Context Sharing](/memgraph-zero/memgql/use-cases/enterprise-context)
-
-Share canonical context — org charts, product hierarchies, ontologies — across
-departments without forcing every team into the same database. Each team keeps
-its own data store; MemGQL provides a unified graph view.
-
## [Horizontally Scalable Distributed Compute](/memgraph-zero/memgql/use-cases/distributed)
Spread graph computation across multiple nodes for workloads that exceed the
capacity of a single instance. MemGQL can partition queries and materialize
intermediate results across a cluster.
-## [Agentic Data Access](/memgraph-zero/memgql/use-cases/agentic)
+## [Enterprise Context Sharing](/memgraph-zero/memgql/use-cases/enterprise-context)
+
+Share canonical context — org charts, product hierarchies, ontologies — across
+departments without forcing every team into the same database. Each team keeps
+its own data store; MemGQL provides a unified graph view.
+
+## [Agentic Access](/memgraph-zero/memgql/use-cases/agentic)
Give AI agents a single semantic layer to discover and query any data in the
organization. Agents use standard GQL to explore relationships across
diff --git a/pages/memgraph-zero/memgql/use-cases/_meta.ts b/pages/memgraph-zero/memgql/use-cases/_meta.ts
index 321b2b0f8..a36f68590 100644
--- a/pages/memgraph-zero/memgql/use-cases/_meta.ts
+++ b/pages/memgraph-zero/memgql/use-cases/_meta.ts
@@ -1,6 +1,7 @@
export default {
+ "federated-gql": "Federated GQL",
"public-private": "Public-Private Data",
- "enterprise-context": "Enterprise Context",
"distributed": "Distributed Compute",
- "agentic": "Agentic Data Access",
+ "enterprise-context": "Enterprise Context",
+ "agentic": "Agentic Access",
}
diff --git a/pages/memgraph-zero/memgql/use-cases/federated-gql.mdx b/pages/memgraph-zero/memgql/use-cases/federated-gql.mdx
new file mode 100644
index 000000000..fd853c23b
--- /dev/null
+++ b/pages/memgraph-zero/memgql/use-cases/federated-gql.mdx
@@ -0,0 +1,110 @@
+---
+title: Federated GQL Across Heterogeneous Backends
+description: Run graph queries across non-graph stores like ClickHouse and PostgreSQL through a single GQL endpoint.
+---
+
+# Federated GQL Across Heterogeneous Backends
+
+Most operational data does not live in a graph database. Transactional records
+sit in PostgreSQL. Analytical events sit in ClickHouse. Each store was chosen
+for good reasons — strong OLTP semantics on one side, fast columnar scans on
+the other — and neither team plans to migrate. But the *relationships* between
+the rows in those stores are exactly what an analyst, an application, or an
+agent wants to traverse.
+
+MemGQL exposes any registered backend as a graph behind a single GQL endpoint
+(ISO/IEC 39075). Clients write standard GQL over Bolt; MemGQL parses the query
+once, plans across all connected backends, pushes the maximal sub-plan each
+backend can execute, and joins the rest locally. Tables in PostgreSQL and
+ClickHouse become nodes and edges through a mapping file — no ETL, no schema
+change, no per-vendor query rewrites.
+
+## The Problem
+
+Cross-store relationships in heterogeneous estates run into four recurring
+frictions:
+
+1. **Dialect Drift**: PostgreSQL speaks standard SQL, ClickHouse speaks its own
+ dialect, graph stores speak Cypher or GQL. Each system has its own
+ functions, type coercions, and join semantics. Queries written against one
+ rarely run unchanged on another.
+
+2. **Cross-Store Joins**: Following a foreign key from a row in PostgreSQL to
+ a row in ClickHouse means pulling both sides into the application, matching
+ keys by hand, and re-implementing join logic the database should be doing.
+
+3. **No Native Graph Surface**: Many of the most interesting questions are
+ graph-shaped — "who is connected to whom", "what's reachable in three hops"
+ — but neither relational nor columnar engines offer a first-class
+ pattern-matching syntax.
+
+4. **Operational Fragmentation**: Each backend has its own driver, connection
+ pool, credentials, TLS setup, and monitoring. Application code accumulates
+ a per-store adapter layer that drifts out of sync with the underlying
+ schemas.
+
+## The Solution
+
+MemGQL sits in front of every registered backend and presents a standards-based
+GQL surface. The query engine:
+
+- **Parses once** — the same GQL parser handles queries regardless of which
+ backends they touch.
+- **Plans globally** — a cost-based optimizer decides, per sub-pattern, which
+ backend should execute it. Sub-plans the backend's `CapabilityProfile`
+ supports are pushed down; the rest runs locally.
+- **Joins across stores** — cross-backend joins materialize both sides locally
+ and hash-join with Arrow IPC shuffle, so a `MATCH` that spans ClickHouse and
+ PostgreSQL behaves like any other join.
+- **Maps tables to graph patterns** — a per-connector mapping file declares
+ which tables become nodes, which become edges, and how columns become
+ properties. The relational schema stays untouched.
+
+Backends stay where they are. Their data, security, and operational ownership
+do not change. What changes is that every client — `mgconsole`, an existing
+Bolt driver, a BI tool — connects to one endpoint and writes one language.
+
+## Scenario
+
+- **PostgreSQL** — the system of record for `persons` and their `knows`
+ relationships, governed by OLTP transactions.
+- **ClickHouse** — a columnar store of `companies` and `works_at` events,
+ optimized for analytical scans across billions of rows.
+- **MemGQL** — a single Bolt endpoint on `:7688` that registers both as named
+ graphs and routes each sub-query appropriately.
+
+```
+ ┌──────────────┐ sql ┌──────────────┐
+ │ │──────▶│ PostgreSQL │
+ │ │ │ (Identity) │
+ │ MemGQL │ └──────────────┘
+┌──────────────┐ │ :7688 │
+│ mgconsole │──bolt───▶│ │ http ┌──────────────┐
+└──────────────┘ │ │──────▶│ ClickHouse │
+ └──────────────┘ │ (Analytics) │
+ └──────────────┘
+```
+
+A composite query like:
+
+```gql
+USE identity MATCH (p:Person {id: $uid})-[:KNOWS]->(f:Person) RETURN f.id AS fid
+UNION ALL
+USE analytics MATCH (p:Person {id: $uid})-[:WORKS_AT]->(c:Company) RETURN c.id AS fid;
+```
+
+is parsed once, dispatched to the two backends in parallel, and merged at the
+coordinator. The application never opens a connection to PostgreSQL or
+ClickHouse directly. Cross-store joins — for example, finding the companies
+where a person's friends work — are expressed as a single GQL pattern; MemGQL
+materializes both sides and joins them locally.
+
+## Why this matters
+
+| Concern | How MemGQL addresses it |
+|---|---|
+| **Standards-based interface** | One ISO/IEC 39075 GQL surface, regardless of backend dialect. |
+| **No migration** | Existing PostgreSQL and ClickHouse deployments stay in place; MemGQL fronts them. |
+| **Graph queries on non-graph stores** | Pattern matching, variable-length paths, and quantified path patterns work over relational and columnar tables. |
+| **Cross-store joins** | Joins between rows in different backends run as first-class GQL, not application glue. |
+| **Capability-aware push-down** | Each connector declares what it can execute; the optimizer pushes down maximal sub-plans. |
diff --git a/pages/memgraph-zero/memgql/use-cases/public-private.mdx b/pages/memgraph-zero/memgql/use-cases/public-private.mdx
index 991d9ade0..384dd4971 100644
--- a/pages/memgraph-zero/memgql/use-cases/public-private.mdx
+++ b/pages/memgraph-zero/memgql/use-cases/public-private.mdx
@@ -62,7 +62,7 @@ MemGQL, and a one-shot init container:
cat > docker-compose.yml << 'EOF'
services:
memgql:
- image: ${MEMGQL_IMAGE:-memgraph/memgql:0.3.0}
+ image: ${MEMGQL_IMAGE:-memgraph/memgql:0.4.0}
ports:
- "7688:7688"
environment: