DevGuideTK
← Trilha Backend

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?

SinalGrafo 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 produtoSim
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 entidadesSim
As consultas são listagens, filtros e somas sobre entidadesNão
Os relacionamentos são chaves estrangeiras de um ou dois níveisNão
O sistema precisa de relatórios e agregações sobre grandes volumesNão, ou só como complemento

Onde guardar o grafo

OpçãoBom paraCustos
PostgreSQL com tabela de arestas e WITH RECURSIVEHierarquias e poucos níveis; um banco a menosProfundidade 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 PostgreSQLMenos maduras e menos otimizadas que um banco de grafos
Neo4jO banco de grafos mais usado: Cypher, algoritmos, ferramentasMais 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ídaLinguagens e ecossistemas diferentes (Gremlin, openCypher, GSQL)
Grafo em memória na aplicaçãoGrafos pequenos, que cabem na memória e mudam poucoRecalcular 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áticaPor 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ósO 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 buscaCREATE CONSTRAINT ... REQUIRE p.id IS UNIQUE, que também cria o índice para achar o ponto de partida
MERGE para criar sem duplicarCREATE sempre cria um nó novo
Cuidado com os supernósUm 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

  1. Sempre com limite de profundidade nos caminhos variáveis: -[:SEGUE*1..4]->.
  2. DISTINCT quando a pergunta é sobre os nós alcançados: no teste, 6 passos geraram 1,1 milhão de caminhos para 50 mil pessoas.
  3. 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.
  4. Ponto de partida indexado: a consulta começa por um nó achado pela restrição de unicidade.
  5. PROFILE no Cypher para ver o plano, como o EXPLAIN ANALYZE do 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 sincronizarAtraso
A aplicação grava nos dois bancosNenhum, mas sem transação entre os dois: um pode falhar
Eventos numa fila, consumidos pelo grafoSegundos; a fila garante que nada se perde
Captura de mudanças do banco principal (CDC)Segundos
Carga periódicaHoras; 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

  1. Grafo quando as perguntas são sobre caminhos, e não listagens e somas.
  2. PostgreSQL com recursão para poucos níveis; banco de grafos quando a profundidade, o menor caminho ou os algoritmos são o centro.
  3. Modele valores compartilhados como nós, com tipos de aresta específicos.
  4. Unicidade e MERGE nas chaves de busca.
  5. Limite de profundidade, DISTINCT e parâmetros em toda consulta de caminho.
  6. 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.