A analogia do openCypher com SQL é útil, mas não é 1:1.
Mapa Mental
| SQL | openCypher |
|---|---|
| banco relacional | grafo |
| tabela | rótulo de nó (:Person) ou tipo de aresta (:AUTHORED) |
| linha | nó ou aresta |
| coluna | propriedade |
| chave primária | propriedade id |
| chave estrangeira | aresta ligando nós |
SELECT ... FROM ... WHERE |
MATCH ... WHERE ... RETURN |
JOIN |
travessia de padrão (a)-[:REL]->(b) |
INSERT |
CREATE |
| upsert | MERGE |
UPDATE |
SET |
DELETE |
DELETE ou DETACH DELETE |
GROUP BY |
agregação com WITH / RETURN |
| CTE / subquery | CALL { ... } |
| recursive CTE | padrão variável [:REL*1..3] |
A principal diferença
No SQL você pensa em "juntar tabelas por chaves".
No openCypher você pensa em "andar pelo grafo por relações".
Exemplo equivalente:
SELECT p.name, pr.title
FROM person p
JOIN authored a ON a.person_id = p.id
JOIN pull_request pr ON pr.id = a.pr_id
WHERE p.name = 'Ana';MATCH (p:Person {name: 'Ana'})-[:AUTHORED]->(pr:PullRequest)
RETURN p.name, pr.title;No SQL, a relação está implícita nas FKs.
No openCypher, a relação é explícita na aresta.
Outro exemplo importante Buscar vizinhos em 2 níveis, que no SQL tende a virar vários joins ou recursão:
MATCH (s:Service {id: 'svc-auth'})-[:AFFECTS|TOUCHES*1..2]-(n)
RETURN s, nIsso é próximo de uma recursive CTE em SQL, mas em openCypher é nativo.
Regra prática
- SQL responde bem "quais linhas satisfazem esse filtro?"
- openCypher responde bem "quais entidades estão conectadas a esta entidade, por quais caminhos?"
Para GraphRAG, openCypher encaixa melhor porque o contexto quase sempre é "acha os nós semanticamente relevantes e expande suas conexões".