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
| Clause | Status | Notes |
|---|---|---|
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 | ✅ | |
WHERE | ✅ | full predicate language; pushdown to SST + Parquet |
RETURN | ✅ | aliases, expressions, aggregations |
ORDER BY ... LIMIT n / SKIP n | ✅ | top-K pushdown into the executor |
WITH ... AS ... | ✅ | pipeline composition |
UNION ALL | ✅ | |
EXISTS { ... } | ✅ | decorrelated to hash semi-join |
Write clauses
| Clause | Status | Notes |
|---|---|---|
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 = expr | ✅ | per-property mutation |
SET n += {map} | ✅ | bulk property update |
DELETE n | ✅ | deletes the node (requires no edges) |
DETACH DELETE n | ✅ | deletes node + its edges |
REMOVE n.prop | ✅ | per-property tombstone |
REMOVE n:Label | ✅ | label tombstone |
Every write is durable on commit: WAL append + manifest CAS happen before the call returns.
Built-in functions
| Function | Status |
|---|---|
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 NodeIdMATCH (n:Person {_id: $uuid}) RETURN nRETURN id(n) // function form, same valueRETURN n._id // accessor form
// Use `id` as a user propertyCREATE (n:Person {id: 'external-42', name: 'Alice'})MATCH (n:Person) WHERE n.id = 'external-42' RETURN nSee 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 = $countryRETURN p.name AS nameDriver-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(usemerge_nodes/merge_edgesbulk 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.