Skip to content

Supported subset

NamiDB targets a strict subset of GQL (ISO/IEC 39075:2024) plus openCypher 9. Every query in this section parses, plans, and executes end-to-end on the v0.3 engine.

Read clauses

ClauseStatusNotes
MATCH (n)label-less match fans out across all observed labels
MATCH (n:Label {prop: $p})property predicates lift into the scan
MATCH (a)-[r:TYPE]->(b)typed and untyped edges
MATCH (a)-[r:TYPE*1..N]->(b)bounded variable-length paths
OPTIONAL MATCH
WHEREfull predicate language; pushdown to SST + Parquet
RETURNaliases, expressions, aggregations
ORDER BY ... LIMIT n / SKIP ntop-K pushdown into the executor
WITH ... AS ...pipeline composition
UNION ALL
EXISTS { ... }decorrelated to hash semi-join

Write clauses

ClauseStatusNotes
CREATE (n:L {props})new NodeId per row
CREATE (a)-[:T]->(b)requires both endpoints bound
MERGE (n:L {props})upsert semantics
MERGE (a)-[r:T]->(b)both endpoints must be bound (v0.3)
SET n.prop = exprper-property mutation
SET n += {map}bulk property update
DELETE ndeletes the node (requires no edges)
DETACH DELETE ndeletes node + its edges
REMOVE n.propper-property tombstone
REMOVE n:Labellabel tombstone

Every write is durable on commit: WAL append + manifest CAS happen before the call returns.

Built-in functions

FunctionStatus
id(n), n._id✅ — returns the internal NodeId
labels(n), type(r)
count(*), count(expr), sum, avg, min, max, collect
coalesce, case ... when ... end
size(list), length(path)
toString, toInteger, toFloat, toBoolean
startsWith, endsWith, contains
properties(n)

Internal _id and the id property

Since v0.3, _id is the engine’s internal NodeId and id is a plain user property.

// Address the internal NodeId
MATCH (n:Person {_id: $uuid}) RETURN n
RETURN id(n) // function form, same value
RETURN n._id // accessor form
// Use `id` as a user property
CREATE (n:Person {id: 'external-42', name: 'Alice'})
MATCH (n:Person) WHERE n.id = 'external-42' RETURN n

See the v0.3.0 release notes for the migration story from v0.2.

Parameters

Parameters are positional via $name placeholders:

MATCH (p:Person)
WHERE p.age >= $min AND p.country = $country
RETURN p.name AS name

Driver-side (Python):

result = client.cypher(query, params={"min": 18, "country": "EC"})

Not supported (yet)

  • CALL { ... } subqueries
  • User-defined procedures / functions
  • Index hints (USING INDEX)
  • LOAD CSV (use merge_nodes / merge_edges bulk APIs instead)
  • Schema-defining clauses (CREATE CONSTRAINT, CREATE INDEX) — schema is currently inferred from writes; explicit DDL is on the roadmap.
  • Path patterns longer than the LDBC IC09 / IC11 shapes — variable-length paths beyond [*1..N] are out of scope today.

See also