• Start

GQL

Overview

Query SurrealDB graph data with ISO GQL (OpenGQL) — a Cypher-like graph pattern language over HTTP and RPC.

Available since: v3.2.0

SurrealDB supports ISO/IEC 39075 GQL (often called OpenGQL) for read-only graph pattern matching over your existing tables and RELATE edges. The surface syntax is closer to Cypher-style MATCH … RETURN than to SurrealQL SELECT, but it runs on the same storage model: node labels map to tables, edge types map to relation tables, and properties map to record fields.

  • You already think in graph patterns such as (a)-[:knows]->(b), SHORTEST, and ALL SHORTEST, and have yet to learn how to query such paths in SurrealQL.

  • You are migrating a database from Neo4j to SurrealDB and want to test to ensure that existing Cypher queries map to the same output.

  • You want a stable graph query surface aligned with the ISO GQL standard.

For general-purpose CRUD, schema changes, and full SurrealQL expressiveness, keep using SurrealQL and the /sql endpoint.

SurfaceHow to call
HTTPPOST /gql — raw GQL query in the request body
WebSocket RPC{ "method": "gql", "params": ["<query>", { "var": value }] } — use for typed $variables
MCPgql tool (when the server exposes MCP)

Session headers match /sql: Surreal-NS, Surreal-DB, and authentication. Responses use the same JSON envelope as /sql (status, result, time).

GQLSurrealDB
(:person)Rows in table person
-[k:knows]->Rows in relation table knows (in / out record IDs)
n.nameField name on the bound record
$minParameter — bind via RPC params object (typed JSON values)

GQL is not lowered to SurrealQL text — it compiles to an internal match plan and runs on the streaming engine. The sample queries page shows SurrealQL that returns the same shape where a close equivalent exists; some patterns (optional match blocks, path selectors) are much more concise in GQL.

  • -- starts a line comment, not an undirected edge.

  • Inequality is <>, not !=.

  • Label conjunction uses & (:person&employee), not :person:employee.

  • Variable-length quantifiers are postfix on the edge: -[e:knows]->{1,3}(b), not *1..3 inside the brackets.

  • No IN list membership operator in this subset.

The upstream OpenGQL design notes and supported read-only subset are documented in the SurrealDB source tree under doc/opengql/ (REFERENCE.md, LOWERING.md).

Was this page helpful?