Bancos de grafos
Quando os relacionamentos são o dado principal, como em redes sociais e detecção de fraude.
As decisões sobre grafos são quatro: se o problema é de grafo, onde guardar o grafo, como modelá-lo e como mantê-lo junto com o resto dos dados.
O problema é de grafo?
| Sinal | Grafo ajuda? |
|---|---|
| As consultas falam de caminhos de comprimento variável ("a até N passos", "qualquer ligação") | Sim |
| O menor caminho, a centralidade ou as comunidades são parte do produto | Sim |
| Os padrões de ligação mudam e são descobertos com o tempo (fraude, investigação) | Sim |
| Os relacionamentos têm propriedades próprias e são tão importantes quanto as entidades | Sim |
| As consultas são listagens, filtros e somas sobre entidades | Não |
| Os relacionamentos são chaves estrangeiras de um ou dois níveis | Não |
| O sistema precisa de relatórios e agregações sobre grandes volumes | Não, ou só como complemento |
Onde guardar o grafo
| Opção | Bom para | Custos |
|---|---|---|
PostgreSQL com tabela de arestas e WITH RECURSIVE | Hierarquias e poucos níveis; um banco a menos | Profundidade e menor caminho custam mais (488 ms contra 1 ms no teste) |
| Extensões no PostgreSQL (Apache AGE, com Cypher; pgRouting, para rotas) | Consultas de grafo sem sair do PostgreSQL | Menos maduras e menos otimizadas que um banco de grafos |
| Neo4j | O banco de grafos mais usado: Cypher, algoritmos, ferramentas | Mais um banco para operar e sincronizar; a edição comunitária não tem cluster |
| Outros bancos de grafos (Amazon Neptune, Memgraph, TigerGraph) | Gerenciados na nuvem, em memória, ou com escala distribuída | Linguagens e ecossistemas diferentes (Gremlin, openCypher, GSQL) |
| Grafo em memória na aplicação | Grafos pequenos, que cabem na memória e mudam pouco | Recalcular a cada mudança; nada compartilhado entre instâncias |
O teste do nível Conceito dá a régua: até 4 ou 5 passos, a recursão no PostgreSQL ficou perto do Neo4j (11 contra 6 ms a 4 passos). A distância cresceu com a profundidade e virou um abismo no menor caminho. Comece pelo PostgreSQL se o grafo é secundário; vá para um banco de grafos quando ele for o centro.
Como modelar
| Prática | Por quê |
|---|---|
| Nós para entidades, arestas para relações com significado | (:Pessoa)-[:TRABALHA_EM {desde}]->(:Empresa), e não uma propriedade empresa no nó |
| Tipos de aresta específicos | :COMPROU, :AVALIOU, :DEVOLVEU são mais rápidos de percorrer que uma :INTERAGIU {tipo} genérica |
| Valores repetidos e consultados como nós | O aparelho, o cartão e o endereço como nós, e não como propriedades, para que as contas que os compartilham fiquem ligadas |
| Restrição de unicidade na chave de busca | CREATE CONSTRAINT ... REQUIRE p.id IS UNIQUE, que também cria o índice para achar o ponto de partida |
MERGE para criar sem duplicar | CREATE sempre cria um nó novo |
| Cuidado com os supernós | Um nó com milhões de arestas (uma celebridade, o país "Brasil") deixa lentas as consultas que passam por ele |
O terceiro item é o que faz a detecção de fraude funcionar. Se o aparelho for só uma propriedade da conta, achar as contas que usam o mesmo aparelho é uma busca na tabela. Se for um nó, as contas que o compartilham ficam a dois passos, e um anel de contas ligadas por aparelhos, cartões e endereços aparece como um caminho.
Consultas seguras
- Sempre com limite de profundidade nos caminhos variáveis:
-[:SEGUE*1..4]->. DISTINCTquando a pergunta é sobre os nós alcançados: no teste, 6 passos geraram 1,1 milhão de caminhos para 50 mil pessoas.- Parâmetros (
$nome), nunca texto concatenado: evita injeção e reaproveita o plano, que custou de 65 a 150 ms na primeira execução do teste. - Ponto de partida indexado: a consulta começa por um nó achado pela restrição de unicidade.
PROFILEno Cypher para ver o plano, como oEXPLAIN ANALYZEdo PostgreSQL.
O grafo e o resto dos dados
O banco de grafos raramente é a única fonte dos dados. O cadastro do cliente, os pedidos e os pagamentos continuam no banco principal, e o grafo guarda as ligações para as consultas que precisam delas.
| Forma de sincronizar | Atraso |
|---|---|
| A aplicação grava nos dois bancos | Nenhum, mas sem transação entre os dois: um pode falhar |
| Eventos numa fila, consumidos pelo grafo | Segundos; a fila garante que nada se perde |
| Captura de mudanças do banco principal (CDC) | Segundos |
| Carga periódica | Horas; aceitável para recomendações |
Defina qual banco é a fonte da verdade de cada dado. O grafo costuma ser uma visão derivada, que pode ser reconstruída a partir do banco principal.
Resumo da decisão
- Grafo quando as perguntas são sobre caminhos, e não listagens e somas.
- PostgreSQL com recursão para poucos níveis; banco de grafos quando a profundidade, o menor caminho ou os algoritmos são o centro.
- Modele valores compartilhados como nós, com tipos de aresta específicos.
- Unicidade e
MERGEnas chaves de busca. - Limite de profundidade,
DISTINCTe parâmetros em toda consulta de caminho. - O grafo como visão derivada, sincronizado a partir da fonte da verdade.
O próximo nível mostra uma recomendação por amigos em comum nas cinco linguagens, com os drivers oficiais do Neo4j.
Prompts para aprofundar
Ao abrir no ChatGPT ou no Claude, o prompt é enviado ao serviço escolhido pela URL e também fica copiado na sua área de transferência.
Decidir se o meu problema é de grafo
Quero saber se um banco de grafos faz sentido no meu sistema. Pergunte quais são as entidades, quais relacionamentos existem, quais perguntas os usuários fazem e qual é o volume. Para cada pergunta, diga se ela é sobre caminhos ou sobre entidades. Depois recomende: tabela de arestas com recursão no PostgreSQL, uma extensão de grafos, ou um banco de grafos dedicado, explicando o porquê e como o grafo seria sincronizado com a fonte da verdade.
Modelar um grafo
Quero modelar um domínio como grafo. Pergunte qual é o domínio e quais perguntas o grafo precisa responder. Me guie: 1. Quais entidades viram nós, e quais valores compartilhados também viram nós. 2. Os tipos de aresta, específicos, com as propriedades de cada um. 3. As restrições de unicidade e os índices. 4. Os supernós que podem aparecer, e como lidar com eles. 5. As consultas Cypher das perguntas principais, com limite de profundidade.
Sincronizar um grafo com o banco principal
Meu sistema tem um banco relacional como fonte da verdade e quero um banco de grafos para algumas consultas. Pergunte qual banco principal e qual banco de grafos eu uso, quais dados vão para o grafo e com que atraso eles podem chegar. Compare gravar nos dois bancos, eventos numa fila, captura de mudanças (CDC) e carga periódica. Monte comigo a opção escolhida, com o tratamento de falhas e a forma de reconstruir o grafo do zero.