Saltearse al contenido

Queries de lectura

Esta página recorre el lado de lectura de Cypher en NamiDB, con ejemplos que corren todos en el motor actual.

MATCH

MATCH (p:Person) RETURN p.name LIMIT 10

MATCH (n) sin label se expande a cada label observada en el namespace (memtable + SSTs persistidos + schema declarado).

MATCH (n) RETURN labels(n), count(*) AS n

Pattern matching

MATCH (a:Person {name: $name})-[:KNOWS]->(b:Person)
RETURN b.name AS friend

Los predicados sobre propiedades dentro del pattern entre llaves se empujan hacia abajo al scan de SST y se usan para pruning con bloom-filter / fence-pointer.

Paths de longitud variable

MATCH (a:Person {_id: $start})-[:KNOWS*1..3]->(b)
RETURN DISTINCT b.name AS friend_of_friend

Los límites de profundidad (1..3) son obligatorios — el * sin acotar está fuera de scope.

Filtros

MATCH (p:Person)
WHERE p.age >= $min AND p.country IN ['EC', 'SV']
RETURN p.name AS name, p.age AS age
ORDER BY p.age DESC
LIMIT 100

Los predicados se empujan a través de los joins (RFC-011) y a través del pruning de row-group de Parquet (RFC-013).

Optional match

MATCH (p:Person {_id: $id})
OPTIONAL MATCH (p)-[:OWNS]->(c:Car)
RETURN p.name AS name, collect(c.model) AS cars

c.model va a ser null/vacío si no existe un edge OWNS.

Subqueries de existencia

MATCH (p:Person)
WHERE EXISTS {
MATCH (p)-[:WORKS_AT]->(:Company {country: $country})
}
RETURN p.name

EXISTS { ... } se decorrela en un hash semi-join (RFC-014) — sin loop anidado.

Agregaciones

MATCH (p:Person)-[:KNOWS]->(b)
RETURN p.country AS country, count(DISTINCT b) AS reach
ORDER BY reach DESC
LIMIT 20

La agregación vectorizada corre morsel-at-a-time; el group-by usa un hash-aggregator.

EXPLAIN

EXPLAIN VERBOSE
MATCH (a:Person)-[:KNOWS]->(b) RETURN b ORDER BY b.id LIMIT 20

imprime el plan lógico elegido con anotaciones de selectividad y costo, más el árbol de operadores físicos.

Ventana de terminal
namidb explain --verbose "MATCH (a:Person)-[:KNOWS]->(b) RETURN b LIMIT 5"

Ver también