Subset soportado
NamiDB apunta a un subset estricto de GQL (ISO/IEC 39075:2024) más openCypher 9. Cada query de esta sección parsea, planifica y se ejecuta de punta a punta en el motor v0.3.
Cláusulas de lectura
| Cláusula | Estado | Notas |
|---|---|---|
MATCH (n) | ✅ | el match sin label se expande a todas las labels observadas |
MATCH (n:Label {prop: $p}) | ✅ | los predicados sobre propiedades suben al scan |
MATCH (a)-[r:TYPE]->(b) | ✅ | edges tipados y sin tipo |
MATCH (a)-[r:TYPE*1..N]->(b) | ✅ | paths de longitud variable acotados |
OPTIONAL MATCH | ✅ | |
WHERE | ✅ | lenguaje de predicados completo; pushdown a SST + Parquet |
RETURN | ✅ | alias, expresiones, agregaciones |
ORDER BY ... LIMIT n / SKIP n | ✅ | pushdown de top-K al executor |
WITH ... AS ... | ✅ | composición de pipeline |
UNION ALL | ✅ | |
EXISTS { ... } | ✅ | decorrelado a hash semi-join |
Cláusulas de escritura
| Cláusula | Estado | Notas |
|---|---|---|
CREATE (n:L {props}) | ✅ | nuevo NodeId por fila |
CREATE (a)-[:T]->(b) | ✅ | requiere que ambos endpoints estén bound |
MERGE (n:L {props}) | ✅ | semántica de upsert |
MERGE (a)-[r:T]->(b) | ✅ | ambos endpoints deben estar bound (v0.3) |
SET n.prop = expr | ✅ | mutación por propiedad |
SET n += {map} | ✅ | actualización bulk de propiedades |
DELETE n | ✅ | borra el nodo (no debe tener edges) |
DETACH DELETE n | ✅ | borra el nodo + sus edges |
REMOVE n.prop | ✅ | tombstone por propiedad |
REMOVE n:Label | ✅ | tombstone de label |
Toda escritura es durable al hacer commit: el WAL append + el manifest CAS ocurren antes de que la llamada retorne.
Funciones built-in
| Función | Estado |
|---|---|
id(n), n._id | ✅ — retorna el NodeId interno |
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) | ✅ |
El _id interno y la propiedad id
Desde v0.3, _id es el NodeId interno del motor e id es una
propiedad de usuario común.
// Direccionar el NodeId internoMATCH (n:Person {_id: $uuid}) RETURN nRETURN id(n) // forma de función, mismo valorRETURN n._id // forma de accesor
// Usar `id` como propiedad de usuarioCREATE (n:Person {id: 'external-42', name: 'Alice'})MATCH (n:Person) WHERE n.id = 'external-42' RETURN nVer las notas de release de v0.3.0 para la historia de migración desde v0.2.
Parámetros
Los parámetros son posicionales vía placeholders $name:
MATCH (p:Person)WHERE p.age >= $min AND p.country = $countryRETURN p.name AS nameDesde el driver (Python):
result = client.cypher(query, params={"min": 18, "country": "EC"})Aún no soportado
- Subqueries
CALL { ... } - Procedures / funciones definidas por el usuario
- Hints de índice (
USING INDEX) LOAD CSV(usar las APIs bulkmerge_nodes/merge_edgesen su lugar)- Cláusulas que definen schema (
CREATE CONSTRAINT,CREATE INDEX) — el schema hoy se infiere a partir de las escrituras; el DDL explícito está en el roadmap. - Path patterns más largos que las formas de LDBC IC09 / IC11 — los paths
de longitud variable más allá de
[*1..N]están fuera de scope hoy.