This document maps Grafeo's GQL implementation against the ISO/IEC 39075:2024 standard, declaring which features are supported, partially supported or not yet implemented.
Grafeo targets minimum conformance plus a broad set of optional features.
A machine-readable version of this compliance matrix is available as gql-dialect.json for tool integration (e.g. GraphGlot). Regenerate it with python scripts/gql-conformance.py dialect.
Per the standard, minimum conformance requires:
| Requirement | Status | Notes |
| Open graph type (GG01) | Supported | Default graph type is open |
| STRING type | Supported | |
| BOOLEAN type | Supported | |
| Signed INTEGER type | Supported | 64-bit (INT64) |
| FLOAT type | Supported | 64-bit (FLOAT64) |
| Unicode >= 13.0 | Supported | Uses Rust's native Unicode support |
Core Language: Statements
Query Statements (Section 14)
| Feature | Status | Notes |
| MATCH clause | Supported | Single and multiple patterns |
| OPTIONAL MATCH | Supported | Left-join semantics |
| WHERE clause | Supported | Standalone and element-level |
| RETURN clause | Supported | With DISTINCT, aliases |
| RETURN * | Supported | Returns all bound variables |
| ORDER BY (ASC/DESC) | Supported | |
| SKIP / OFFSET | Supported | Both keywords accepted |
| LIMIT / FETCH FIRST n ROWS | Supported | Both forms |
| GROUP BY | Supported | Explicit grouping |
| HAVING | Supported | Aggregate result filtering |
| FINISH | Supported | Consume input, return empty |
| EXPLAIN | Supported | Returns query plan |
Data Modification (Section 13)
| Feature | Status | Notes |
| INSERT (graph patterns) | Supported | Nodes and edges |
| SET (property assignment) | Supported | Single and map assignment |
| SET (label operations) | Supported | Add labels |
| REMOVE (properties) | Supported | |
| REMOVE (labels) | Supported | |
| DELETE | Supported | |
| DETACH DELETE | Supported | Auto-removes connected edges |
| MERGE | Supported | ON CREATE / ON MATCH actions |
Catalog / DDL (Section 12)
| Feature | Status | Notes |
| CREATE SCHEMA | Supported | With IF NOT EXISTS |
| DROP SCHEMA | Supported | With IF EXISTS |
| CREATE GRAPH | Supported | With IF NOT EXISTS, optional TYPED |
| DROP GRAPH | Supported | With IF EXISTS |
| CREATE GRAPH TYPE | Supported | Open/closed, node/edge type lists |
| DROP GRAPH TYPE | Supported | With IF EXISTS |
| CREATE NODE TYPE | Supported | With property definitions |
| DROP NODE TYPE | Supported | |
| CREATE EDGE TYPE | Supported | With property definitions |
| DROP EDGE TYPE | Supported | |
| ALTER NODE/EDGE/GRAPH TYPE | Supported | ADD/DROP property, ADD/DROP type |
| CREATE INDEX | Supported | Property, text, vector, B-tree |
| CREATE CONSTRAINT | Supported | UNIQUE, NOT NULL, NODE KEY, EXISTS |
| CREATE PROCEDURE | Supported | Params, returns, GQL body |
Session Management (Section 7)
| Feature | Status | Notes |
| USE GRAPH | Supported | |
| SESSION SET GRAPH | Supported | |
| SESSION SET TIME ZONE | Supported | |
| SESSION SET PARAMETER | Supported | |
| SESSION RESET | Supported | |
| SESSION CLOSE | Supported | |
Transaction Management (Section 8)
| Feature | Status | Notes |
| START TRANSACTION | Supported | |
| READ ONLY / READ WRITE mode | Supported | |
| ISOLATION LEVEL | Supported | READ COMMITTED, SNAPSHOT, SERIALIZABLE |
| COMMIT | Supported | |
| ROLLBACK | Supported | |
| SAVEPOINT | Supported | Named savepoints within transactions |
| ROLLBACK TO SAVEPOINT | Supported | Partial rollback to savepoint |
| RELEASE SAVEPOINT | Supported | Discard savepoint, keep changes |
Procedure Calling (Section 15)
| Feature | Status | Notes |
| CALL named_procedure(args) | Supported | Qualified names |
| YIELD clause | Supported | With aliases |
| Inline CALL | Supported | |
| OPTIONAL CALL | Supported | Left-join semantics |
Composite Queries (Section 14)
| Feature | Status | Notes |
| UNION / UNION ALL | Supported | |
| EXCEPT / EXCEPT ALL | Supported | |
| INTERSECT / INTERSECT ALL | Supported | |
| OTHERWISE | Supported | Fallback if left is empty |
| NEXT (linear composition) | Supported | Output feeds into next |
Graph Patterns (Section 16)
Node and Edge Patterns
| Feature | Status | Notes |
Node patterns (n:Label) | Supported | Variables, labels, properties |
Edge patterns -[:TYPE]-> | Supported | All directions |
Undirected edges -[]- | Supported | |
Element-level WHERE (n WHERE ...) | Supported | Nodes and edges |
Property filters {key: value} | Supported | |
Label Expressions (Section 16.8)
| Feature | Status | Notes |
Single label :Label | Supported | |
IS syntax IS Label | Supported | |
Disjunction \| | Supported | IS Person \| Company |
Conjunction & | Supported | IS Person & Employee |
Negation ! | Supported | IS !Inactive |
Wildcard % | Supported | Matches any label |
Path Modes (Section 16.6)
| Feature | Status | Notes |
| WALK (default) | Supported | Repeated nodes/edges allowed |
| TRAIL | Supported | No repeated edges |
| SIMPLE | Supported | No repeated nodes (except endpoints) |
| ACYCLIC | Supported | No repeated nodes at all |
Path Search Prefixes (Section 16.6)
| Feature | Status | Notes |
| ALL | Supported | |
| ANY | Supported | |
| ANY k | Supported | |
| ALL SHORTEST | Supported | |
| ANY SHORTEST | Supported | |
| SHORTEST k | Supported | |
| SHORTEST k GROUPS | Supported | |
Match Modes (Section 16.4)
| Feature | Status | Notes |
| DIFFERENT EDGES | Supported | |
| REPEATABLE ELEMENTS | Supported | |
| KEEP clause (per-pattern) | Supported | |
Quantifiers (Section 16.11)
| Feature | Status | Notes |
{m,n} bounded | Supported | |
{m,} lower-bounded | Supported | |
{n} fixed | Supported | Normalized to {n,n} |
* (0 or more) | Supported | Normalized to {0,} |
+ (1 or more) | Supported | Normalized to {1,} |
? questioned | Supported | 0 or 1 hop |
Parenthesized quantified ((a)-[e]->(b)){2,5} | Supported | |
Pattern Composition
| Feature | Status | Notes |
| Multiple comma-separated patterns | Supported | Implicit join on shared variables |
Pattern union \| | Supported | |
Path aliases p = (a)-[*]-(b) | Supported | |
| shortestPath / allShortestPaths | Supported | Cypher-style functions |
Expressions and Predicates
Operators
| Feature | Status | Notes |
Comparison: =, <>, <, >, <=, >= | Supported | |
| Logical: AND, OR, NOT, XOR | Supported | |
Arithmetic: +, -, *, /, % | Supported | |
String concatenation \|\| | Supported | |
| LIKE pattern matching | Supported | |
| IN list membership | Supported | |
| STARTS WITH / ENDS WITH / CONTAINS | Supported | |
Predicates (Section 19)
| Feature | Status | Notes |
| IS [NOT] NULL | Supported | |
| IS [NOT] DIRECTED (G110) | Supported | Desugared to function call |
| IS [NOT] LABELED (G111) | Supported | Desugared to function call |
| IS [NOT] SOURCE/DESTINATION OF (G112) | Supported | Desugared to function call |
| IS [NOT] TYPED (GA06) | Supported | Desugared to function call |
| IS [NOT] NORMALIZED | Supported | NFC, NFD, NFKC, NFKD forms supported |
| ALL_DIFFERENT (G113) | Supported | Multi-variable and single-list forms |
| SAME (G114) | Supported | Multi-variable and single-list forms |
| PROPERTY_EXISTS (G115) | Supported | Desugared to function call |
Value Expressions (Section 20)
| Feature | Status | Notes |
| Literals (int, float, string, bool, null) | Supported | |
| Typed temporal literals (DATE, TIME, etc.) | Supported | DATE, TIME, DATETIME, DURATION, ZONED DATETIME/TIME |
| Variable references | Supported | |
Property access n.prop | Supported | |
Parameter references $name | Supported | |
| Function calls | Supported | Built-in and user-defined |
| CASE WHEN / THEN / ELSE | Supported | Simple and searched |
| CAST(expr AS type) (GA05) | Supported | |
List literals [1, 2, 3] | Supported | |
Map literals {k: v} | Supported | |
Index access list[0] | Supported | |
List comprehension [x IN list WHERE p \| e] | Supported | |
| List predicates (all/any/none/single) | Supported | |
| REDUCE accumulator | Supported | |
| LET ... IN ... END (GE03) | Supported | |
| EXISTS | Supported | |
| COUNT | Supported | |
| VALUE { subquery } (GQ18) | Supported | |
| NULLIF / COALESCE | Supported | Both keyword syntax and function calls |
Aggregate Functions
| Feature | Status | Notes |
| count(*) / count(expr) | Supported | Including DISTINCT |
| sum / avg / min / max | Supported | |
| collect_list | Supported | |
| stdev / percentile | Supported | Extension |
| Vertical aggregation (GROUP BY) | Supported | |
| Horizontal aggregation (GE09) | Not yet | Group list variables from var-length patterns |
Optional Features (Annex D)
Pattern Features
| ID | Feature | Status |
| G002 | Different-edges match mode | Supported |
| G003 | Explicit REPEATABLE ELEMENTS | Supported |
| G004 | Path variables | Supported |
| G005 | Path search prefix in path pattern | Supported |
| G006 | KEEP clause: path mode prefix | Supported |
| G007 | KEEP clause: path search prefix | Supported |
| G010 | Explicit WALK keyword | Supported |
| G011 | Advanced path modes: TRAIL | Supported |
| G012 | Advanced path modes: SIMPLE | Supported |
| G013 | Advanced path modes: ACYCLIC | Supported |
| G014 | Explicit PATH/PATHS keywords | Supported |
| G015 | All path search: explicit ALL keyword | Supported |
| G016 | Any path search | Supported |
| G017 | All shortest path search | Supported |
| G018 | Any shortest path search | Supported |
| G019 | Counted shortest path search | Supported |
| G020 | Counted shortest group search | Supported |
| G030 | Path multiset alternation | Supported |
| G031 | Path multiset alternation: var-length operands | Supported |
| G032 | Path pattern union | Supported |
| G033 | Path pattern union: var-length operands | Supported |
| G035 | Quantified paths | Supported |
| G036 | Quantified edges | Supported |
| G037 | Questioned paths | Supported |
| G038 | Parenthesized path pattern expression | Supported |
| G039 | Simplified path pattern: full defaulting | Supported |
| G041 | Non-local element pattern predicates | Not yet |
| G043 | Complete full edge patterns | Supported |
| G044 | Basic abbreviated edge patterns | Supported |
| G045 | Complete abbreviated edge patterns | Supported |
| G046 | Relaxed topological consistency: adjacent vertex | Not yet |
| G047 | Relaxed topological consistency: concise edge | Not yet |
| G048 | Parenthesized path: subpath variable declaration | Partial (parsed, not yet bound in plan) |
| G049 | Parenthesized path: path mode prefix | Supported |
| G050 | Parenthesized path: WHERE clause | Supported |
| G051 | Parenthesized path: non-local predicates | Not yet |
| G060 | Bounded graph pattern quantifiers | Supported |
| G061 | Unbounded graph pattern quantifiers | Supported |
| G074 | Label expression: wildcard label | Supported |
| G080 | Simplified path pattern: basic defaulting | Supported |
| G081 | Simplified path pattern: full overrides | Supported |
| G082 | Simplified path pattern: basic overrides | Supported |
Predicate & Expression Features
| ID | Feature | Status |
| G100 | ELEMENT_ID function | Supported |
| G110 | IS DIRECTED predicate | Supported |
| G111 | IS LABELED predicate | Supported |
| G112 | IS SOURCE / IS DESTINATION predicate | Supported |
| G113 | ALL_DIFFERENT predicate | Supported |
| G114 | SAME predicate | Supported |
| G115 | PROPERTY_EXISTS predicate | Supported |
| GA01 | IEEE 754 floating point operations | Supported |
| GA03 | Explicit ordering of nulls | Supported |
| GA04 | Universal comparison | Not yet |
| GA05 | Cast specification | Supported |
| GA06 | Value type predicate | Supported |
| GA07 | Ordering by discarded binding variables | Not yet |
| GA08 | GQL-status objects with diagnostic records | Not yet |
| GA09 | Comparison of paths | Supported |
| GE01 | Graph reference value expressions | Not yet |
| GE02 | Binding table reference value expressions | Not yet |
| GE03 | Let-binding in expressions | Supported |
| GE04 | Graph parameters | Not yet |
| GE05 | Binding table parameters | Not yet |
| GE06 | Path value construction | Not yet |
| GE07 | Boolean XOR | Supported |
| GE08 | Reference parameters | Supported |
| GE09 | Horizontal aggregation | Not yet |
Function Features
| ID | Feature | Status |
| GF01 | Enhanced numeric functions | Supported |
| GF02 | Trigonometric functions | Supported |
| GF03 | Logarithmic functions | Supported |
| GF04 | Enhanced path functions | Supported |
| GF05 | Multi-character TRIM function | Supported |
| GF06 | Explicit TRIM function | Supported |
| GF07 | Byte string TRIM function | Not yet |
| GF10 | Advanced aggregates: general set functions | Supported |
| GF11 | Advanced aggregates: binary set functions | Supported |
| GF12 | CARDINALITY function | Supported |
| GF13 | SIZE function | Supported |
| GF20 | Aggregate functions in sort keys | Supported |
Catalog & Graph Features
| ID | Feature | Status |
| GC01 | Graph schema management | Supported |
| GC02 | Schema management: IF [NOT] EXISTS | Supported |
| GC03 | Graph type: IF [NOT] EXISTS | Supported |
| GC04 | Graph management | Supported |
| GC05 | Graph management: IF [NOT] EXISTS | Supported |
| GD01 | Updatable graphs | Supported |
| GD02 | Graph label set changes | Supported |
| GD03 | DELETE: subquery support | Supported |
| GD04 | DELETE: simple expression support | Supported |
| GG01 | Graph with open graph type | Supported |
| GG02 | Graph with closed graph type | Supported |
| GG03 | Graph type inline specification | Supported |
| GG04 | Graph type like a graph | Supported |
| GG05 | Graph from a graph source | Not yet |
| GG20 | Explicit element type names | Supported |
| GG21 | Explicit element type key label sets | Supported |
| GG22 | Element type key label set inference | Supported |
| GG23 | Optional element type key label sets | Not yet |
| GG24 | Relaxed structural consistency | Inactive |
| GG25 | Relaxed key label set uniqueness for edge types | Inactive |
| GG26 | Relaxed property value type consistency | Inactive |
Session & Transaction Features
| ID | Feature | Status |
| GS01 | SESSION SET: session-local graph parameters | Supported |
| GS02 | SESSION SET: session-local binding table parameters | Not yet |
| GS03 | SESSION SET: session-local value parameters | Supported |
| GS04 | SESSION RESET: all characteristics | Supported |
| GS05 | SESSION RESET: session schema | Supported |
| GS06 | SESSION RESET: session graph | Supported |
| GS07 | SESSION RESET: time zone displacement | Supported |
| GS08 | SESSION RESET: all session parameters | Supported |
| GS10 | SESSION SET: binding table parameters based on subqueries | Not yet |
| GS11 | SESSION SET: value parameters based on subqueries | Not yet |
| GS12 | SESSION SET: graph parameters based on simple expressions | Not yet |
| GS13 | SESSION SET: binding table parameters based on simple expressions | Not yet |
| GS14 | SESSION SET: value parameters based on simple expressions | Not yet |
| GS15 | SESSION SET: time zone displacement | Supported |
| GS16 | SESSION RESET: individual session parameters | Not yet |
| GT01 | Explicit transaction commands | Supported |
| GT02 | Specified transaction characteristics | Supported |
| GT03 | Use of multiple graphs in a transaction | Not yet |
Procedure Features
| ID | Feature | Status |
| GP01 | Inline procedure | Supported |
| GP02 | Inline procedure with implicit nested variable scope | Supported |
| GP03 | Inline procedure with explicit nested variable scope | Not yet |
| GP04 | Named procedure calls | Supported |
| GP05 | Procedure-local value variable definitions | Not yet |
| GP06 | Procedure-local value variable definitions: based on simple expressions | Not yet |
| GP07 | Procedure-local value variable definitions: based on subqueries | Not yet |
| GP08 | Procedure-local binding table variable definitions | Not yet |
| GP09 | Procedure-local binding table variable definitions: based on simple expressions | Not yet |
| GP10 | Procedure-local binding table variable definitions: based on subqueries | Not yet |
| GP11 | Procedure-local graph variable definitions | Not yet |
| GP12 | Procedure-local graph variable definitions: based on simple expressions | Not yet |
| GP13 | Procedure-local graph variable definitions: based on subqueries | Not yet |
| GP14 | Binding tables as procedure arguments | Not yet |
| GP15 | Graphs as procedure arguments | Not yet |
| GP16 | AT schema clause | Not yet |
| GP17 | Binding variable definition block | Not yet |
| GP18 | Catalog and data statement mixing | Not yet |
Query Composition Features
| ID | Feature | Status |
| GQ01 | USE graph clause | Supported |
| GQ02 | OTHERWISE | Supported |
| GQ03 | UNION | Supported |
| GQ04 | EXCEPT DISTINCT | Supported |
| GQ05 | EXCEPT ALL | Supported |
| GQ06 | INTERSECT DISTINCT | Supported |
| GQ07 | INTERSECT ALL | Supported |
| GQ08 | FILTER statement | Supported |
| GQ09 | LET statement | Supported |
| GQ10 | FOR statement: list value support | Supported |
| GQ11 | FOR statement: WITH ORDINALITY | Supported |
| GQ12 | ORDER BY: OFFSET clause | Supported |
| GQ13 | ORDER BY: LIMIT clause | Supported |
| GQ14 | Complex expressions in sort keys | Supported |
| GQ15 | GROUP BY clause | Supported |
| GQ16 | Pre-projection aliases in sort keys | Supported |
| GQ17 | Element-wise group variable operations | Not yet |
| GQ18 | Scalar subqueries | Supported |
| GQ19 | Graph pattern YIELD clause | Not yet |
| GQ20 | Advanced linear composition (NEXT) | Supported |
| GQ21 | OPTIONAL: multiple MATCH statements | Supported |
| GQ22 | EXISTS predicate: multiple MATCH | Supported |
| GQ23 | FOR statement: binding table support | Not yet |
| GQ24 | FOR statement: WITH OFFSET | Supported |
Value Type Features
| ID | Feature | Status |
| GV01 | 8-bit unsigned integer numbers | Not yet |
| GV02 | 8-bit signed integer numbers | Not yet |
| GV03 | 16-bit unsigned integer numbers | Not yet |
| GV04 | 16-bit signed integer numbers | Not yet |
| GV05 | Small unsigned integer numbers | Not yet |
| GV06 | 32-bit unsigned integer numbers | Not yet |
| GV07 | 32-bit signed integer numbers | Not yet |
| GV08 | Regular unsigned integer numbers | Not yet |
| GV09 | Specified integer number precision | Not yet |
| GV10 | Big unsigned integer numbers | Not yet |
| GV11 | 64-bit unsigned integer numbers | Not yet |
| GV12 | 64-bit signed integer numbers | Supported |
| GV13 | 128-bit unsigned integer numbers | Not yet |
| GV14 | 128-bit signed integer numbers | Not yet |
| GV15 | 256-bit unsigned integer numbers | Not yet |
| GV16 | 256-bit signed integer numbers | Not yet |
| GV17 | Decimal numbers | Not yet |
| GV18 | Small signed integer numbers | Not yet |
| GV19 | Big signed integer numbers | Not yet |
| GV20 | 16-bit floating point numbers | Not yet |
| GV21 | 32-bit floating point numbers | Not yet |
| GV22 | Specified floating point number precision | Not yet |
| GV23 | Floating point type name synonyms | Not yet |
| GV24 | 64-bit floating point numbers | Supported |
| GV25 | 128-bit floating point numbers | Not yet |
| GV26 | 256-bit floating point numbers | Not yet |
| GV30 | Specified character string minimum length | Not yet |
| GV31 | Specified character string maximum length | Not yet |
| GV32 | Specified character string fixed length | Not yet |
| GV35 | Byte string types | Not yet |
| GV36 | Specified byte string minimum length | Not yet |
| GV37 | Specified byte string maximum length | Not yet |
| GV38 | Specified byte string fixed length | Not yet |
| GV39 | Temporal: date, local datetime/time | Supported |
| GV40 | Temporal: zoned datetime/time | Supported |
| GV41 | Temporal: duration | Supported |
| GV45 | Record types | Not yet |
| GV46 | Closed record types | Not yet |
| GV47 | Open record types | Not yet |
| GV48 | Nested record types | Not yet |
| GV50 | List value types | Supported |
| GV55 | Path value types | Supported |
| GV60 | Graph reference value types | Not yet |
| GV61 | Binding table reference value types | Not yet |
| GV65 | Dynamic union types | Not yet |
| GV66 | Open dynamic union types | Not yet |
| GV67 | Closed dynamic union types | Not yet |
| GV68 | Dynamic property value types | Supported |
| GV70 | Immaterial value types | Not yet |
| GV71 | Immaterial value types: null type support | Supported |
| GV72 | Immaterial value types: empty type support | Not yet |
| GV90 | Explicit value type nullability | Supported |
Lexical Features
| ID | Feature | Status |
| GB01 | Long identifiers | Supported |
| GB02 | Double minus sign comments | Supported |
| GB03 | Double solidus comments | Supported |
| GL01 | Hexadecimal literals | Supported |
| GL02 | Octal literals | Supported |
| GL03 | Binary literals | Supported |
| GL04 | Exact number in common notation without suffix | Not yet |
| GL05 | Exact number in common notation or as decimal integer with suffix | Not yet |
| GL06 | Exact number in scientific notation with suffix | Not yet |
| GL07 | Approximate number in common notation or as decimal integer with suffix | Not yet |
| GL08 | Approximate number in scientific notation with suffix | Not yet |
| GL09 | Optional float number suffix | Not yet |
| GL10 | Optional double number suffix | Not yet |
| GL11 | Opt-out character escaping | Not yet |
| GL12 | SQL datetime and interval formats | Not yet |
Miscellaneous Features
| ID | Feature | Status |
| GH01 | External object references | Not yet |
| GH02 | Undirected edge patterns | Not yet |
Three-Valued Logic
GQL uses three-valued logic where comparisons involving NULL produce UNKNOWN (not FALSE).
| Behavior | Status |
| NULL = NULL returns UNKNOWN | Supported |
| NULL <> NULL returns UNKNOWN | Supported |
| FILTER passes only TRUE (not UNKNOWN) | Supported |
| IS NULL / IS NOT NULL for explicit checks | Supported |
| NULL handling in aggregates (ignored except count(*)) | Supported |
Known Deviations from Standard
-
Predicate desugaring: IS DIRECTED, IS LABELED, IS SOURCE/DESTINATION OF are parsed and internally converted to function calls (isDirected(), hasLabel(), etc.) rather than being preserved as first-class predicate AST nodes. Semantics are equivalent.
-
KEEP clause representation: The standard specifies KEEP <path pattern prefix> wrapping all patterns. Grafeo implements KEEP as a per-pattern match mode flag, which is simpler but semantically equivalent.
-
Variable scope validation: The standard defines degree-of-exposure categories (unconditional singleton, conditional singleton, etc.) at parse time. Grafeo defers variable scope validation to execution time.
-
Simplified path patterns: The -/:Label/-> shorthand is desugared to -[:Label]-> at parse time. Both forms are semantically equivalent.