Pular para conteúdo

Aula 19 - Bancos de Dados Orientados a Grafos (Neo4j) 🕸️

Objetivo Pedagógico

Objetivo: Modelagem de dados altamente conectados com Neo4j: Vértices (Nodes), Arestas (Relationships), Propriedades e consultas expressivas com linguagem Cypher.


📑 1. Fundamentos Teóricos & Análise Técnica

Bancos relacionais sofrem severamente quando precisam consultar redes de relacionamentos complexos (redes sociais, motores de recomendação, rastreamento de fraudes financeiras e detecção de dependências). Uma consulta para encontrar "amigos de amigos até o terceiro nível" exige uma cascata de múltiplos JOINs recursivos que travam o banco relacional.

Os Bancos de Dados Orientados a Grafos (Property Graph Model) tratam os relacionamentos como cidadãos de primeira classe: 1. Nós (Nodes): Representam entidades de domínio (rotuladas com labels como :Pessoa, :Empresa). 2. Relacionamentos (Relationships): Arestas direcionadas e tipadas que conectam nós (-[:AMIGO_DE]->, -[:TRABALHA_NA]->), podendo armazenar propriedades próprias (como desde: 2024). 3. Index-Free Adjacency (Adjacência sem Índice): Cada nó armazena ponteiros diretos de memória física para seus nós vizinhos. Isso significa que percorrer relacionamentos tem custo temporal \(O(1)\) por nó, independentemente do tamanho total do grafo (se o grafo tiver 1 milhão ou 1 bilhão de nós, a travessia local executa na mesma velocidade!).

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph LR
    Ana[":User { nome: 'Ana' }"] -->|:SEGUE { desde: 2023 }| Bruno[":User { nome: 'Bruno' }"]
    Bruno -->|:COMPROU| Celular[":Product { nome: 'Smartphone' }"]
    Ana -->|:AMIGA_DE| Carlos[":User { nome: 'Carlos' }"]
    Carlos -->|:AVALIOU { nota: 5 }| Celular
    style Ana fill:#e1f5fe,stroke:#01579b
    style Bruno fill:#e8f5e9,stroke:#2e7d32
    style Carlos fill:#e8f5e9,stroke:#2e7d32
    style Celular fill:#fff3e0,stroke:#e65100

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Linguagem Declarativa Cypher: Expressão visual de padrões de grafo com parênteses e setas ((u:User)-[:BUYS]->(p:Product)). - Adjacência sem Índice: Consultas de caminhos mínimos e conexões sem sobrecarga de junção de tabelas. - Detecção de Fraudes e Lavagem de Dinheiro: Identificação imediata de anéis cíclicos de transações bancárias suspeitas. - Motores de Recomendação em Tempo Real: Sugestão de produtos baseada no grafo de comportamento de compras de usuários com interesses compartilhados.


🛠️ 2. Implementação Prática em NoSQL Orientado a Grafos e Linguagem Cypher

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// graph_recommendation.cypher (Consulta de Recomendação com Cypher)
// Recomenda produtos comprados por amigos que o usuário ainda não adquiriu
MATCH (u:User {id: 'usr_101'})-[:AMIGO_DE]->(amigo:User)-[:COMPROU]->(p:Product)
WHERE NOT (u)-[:COMPROU]->(p)
RETURN p.nome AS Recomendacao, count(amigo) AS ConexoesRecomendando
ORDER BY ConexoesRecomendando DESC
LIMIT 5;

💡 Análise Passo a Passo do Código

  1. Cláusula MATCH com Padrão Visual: A sintaxe gráfica declara exatamente o caminho de travessia esperado entre usuários e produtos.
  2. Filtro de Exclusão WHERE NOT: Garante que itens que o próprio usuário já comprou sejam descartados da recomendação.
  3. Agregação Ordenada: Conta quantas conexões de confiança compraram aquele produto e ordena os itens mais populares no topo.

🎯 3. Próximos Passos & Sequência Didática