Supported GQL Query Features

What works today, split by backend category. “Cypher backends” means Memgraph and Neo4j (translation is largely passthrough); “SQL backends” means PostgreSQL, MySQL and DuckDB.

ClickHouse, Apache Iceberg, and Apache Pinot are also supported as connectors but with a narrower verified surface. See each connector’s page for the exact list of features each one supports.

FeatureCypher backendsSQL backends
MATCH / WHERE / RETURN
Pattern-level WHERE (MATCH (n WHERE …))
Multi-MATCH (cross-join)
OPTIONAL MATCH (LEFT JOIN semantics)
WITH pipeline boundary (scope D)
WITH DISTINCT / WITH … ORDER BY … LIMIT N
Chained WITH … WITH …
Whole-node WITH n carry-through
MATCH (n)-[r:R]->(m) typed edge expansion
Untyped edge ()-[]->(b) (union over types)
UNION / UNION ALL / UNION DISTINCT
INTERSECT / EXCEPT
Quantified path (){m,n} — bounded
Quantified path (){m,} — unbounded
Shortest-path (ALL SHORTEST / ANY SHORTEST / SHORTEST k)
Map projections RETURN n {.id, .title}
IN list membership WHERE x IN […]
STARTS WITH / ENDS WITH / CONTAINS
collect() / collect_list() (aggregate)
count, sum, avg, min, max
COUNT(DISTINCT …)
Arithmetic + - * / %
CASE WHEN … THEN … ELSE … END
COALESCE, NULLIF
Temporals (date, datetime, localTime, …)
INSERT (a {…}) RETURN a.x
DELETE
DETACH DELETE
SET (property update)
REMOVE (property delete)

Known limitations

  • Unbounded variable-length paths on SQL backends (()-[*]->()) return an actionable error.
  • MATCH p = (...) path binding on quantified traversals (MATCH p = (a){1,3}(b) RETURN p) is not yet supported on SQL backends. Drop the path binding or run the query against a Cypher backend.
  • Whole-node RETURN n over SQL backends projects scalar columns; the Bolt Node struct shape is reserved for Cypher backends today.

Graph Management Query Syntax

ADD GRAPH <name> ON CONNECTOR <connector>
    [GRAPH <remote_name>]
    [MAPPING <mapping_name>]
    [READ ONLY];

CREATE GRAPH <name>
    [{ <gql_schema_body> } | ANY]
    ON CONNECTOR <connector>;

UNADD GRAPH [IF EXISTS] <name>;
DROP GRAPH [IF EXISTS] <name>;

ALTER GRAPH <name> SET READ ONLY;
ALTER GRAPH <name> SET READ WRITE;
ALTER GRAPH <name> SET CONNECTOR <connector>;
ALTER GRAPH <name> SET GRAPH <remote_name>;
ALTER GRAPH <name> SET MAPPING <mapping_name>;
ALTER GRAPH <name> REMOVE MAPPING;
-- Single graph
USE <graph> <query>;

-- Composite
USE <graph1> <query>
UNION | UNION ALL | INTERSECT | INTERSECT ALL | EXCEPT | EXCEPT ALL
USE <graph2> <query>;

Configuration Reference

General

VariableDefaultDescription
CONNECTOR_TYPEmemgraphConnector to use (see table below)
CONNECTION_TYPE(none)Alias for CONNECTOR_TYPE
BOLT_LISTEN_ADDR127.0.0.1:7688Address the Bolt server binds to

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

FlagDefaultDescription
--log-level=<LEVEL>infoConsole logging verbosity (see levels below)
--log-file=<PATH>bolt_server.logFile to mirror all log output to (always written, regardless of --log-level)

Log Levels

LevelConsole output
infoFull logging: connections, incoming queries, transpiled output, results, state changes
info-queries-onlyOnly 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

VariableDefaultDescription
MEMGQL_ENTERPRISE_LICENSE(none)License key (mglk-...)
MEMGQL_ORGANIZATION_NAME(none)Organization name to verify against license

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 2 connectors and 2 simultaneous connections.

Connector Types

ConnectorTranslationBackend
memgraphNone (passthrough)Memgraph
memgraph-gqlGQL -> CypherMemgraph
neo4jNone (passthrough)Neo4j
neo4j-gqlGQL -> CypherNeo4j
postgresGQL -> SQLPostgreSQL
mysqlGQL -> SQLMySQL 8.0+
oracleGQL -> SQLOracle 19c+ (incl. Free 23ai)
duckdbGQL -> SQLDuckDB (embedded)
clickhouseGQL -> SQLClickHouse
icebergGQL -> SQLIceberg via Trino
pinotGQL -> SQLApache Pinot
multiPer-connectorMultiple backends simultaneously

Memgraph (memgraph, memgraph-gql)

VariableDefaultDescription
MEMGRAPH_URI127.0.0.1:7687Connection URI
MEMGRAPH_USERuserUsername
MEMGRAPH_PASSpassPassword
MEMGRAPH_DBmemgraphDatabase name

Neo4j (neo4j, neo4j-gql)

VariableDefaultDescription
NEO4J_URI127.0.0.1:7687Connection URI
NEO4J_USERneo4jUsername
NEO4J_PASSpasswordPassword
NEO4J_DBneo4jDatabase name

PostgreSQL (postgres)

VariableDefaultDescription
POSTGRES_URLhost=localhost user=postgres password=postgres dbname=postgreslibpq connection string
MAPPING_FILE(none, uses built-in default)Path to JSON mapping file

MySQL (mysql)

VariableDefaultDescription
MYSQL_URLmysql://root:mysql@localhost:3306/testMySQL connection URL (mysql://user:pass@host:port/database)
MAPPING_FILE(none, uses built-in default)Path to JSON mapping file

Oracle (oracle)

VariableDefaultDescription
ORACLE_URLoracle://system:oracle@localhost:1521/FREEPDB1Easy Connect URL (oracle://user:pass@host:port/service_name). The default targets Oracle Database Free 23ai (service FREEPDB1).
MAPPING_FILE(none, uses built-in default)Path to JSON mapping file (same format as Postgres)

The Oracle connector uses oracle-rs, a pure-Rust implementation of Oracle’s TNS wire protocol, pooled via deadpool-oracle. No OCI / ODPI-C / Instant Client is required at build or runtime — the bundled Docker image ships only the bolt server binary plus TLS roots, and local builds work on macOS, Linux, and Windows without any extra system packages.

DuckDB (duckdb)

VariableDefaultDescription
DUCKDB_PATH:memory:Path to DuckDB file
MAPPING_FILE(none, uses built-in default)Path to JSON mapping file

ClickHouse (clickhouse)

VariableDefaultDescription
CLICKHOUSE_URLhttp://localhost:8123ClickHouse HTTP API URL
CLICKHOUSE_USERdefaultClickHouse user
CLICKHOUSE_PASS(none)ClickHouse password
CLICKHOUSE_DBdefaultClickHouse database
MAPPING_FILE(none, uses built-in default)Path to JSON mapping file

Apache Pinot (pinot)

VariableDefaultDescription
PINOT_URLhttp://localhost:8099Pinot broker base URL or full SQL endpoint
PINOT_QUERY_OPTIONSuseMultistageEngine=trueQuery options sent with broker SQL requests
MAPPING_FILE(none, uses built-in default)Path to JSON mapping file

Iceberg (iceberg)

VariableDefaultDescription
TRINO_URLhttp://localhost:8080Trino REST API URL
TRINO_USERtrinoTrino user
TRINO_CATALOGicebergTrino catalog
TRINO_SCHEMAdefaultTrino schema
MAPPING_FILE(none, uses built-in default)Path to JSON mapping file