Operações Fundamentais com Neo4j

Perguntas Frequentes

  • Erro de Autenticação: O cliente não está autorizado devido a falha na autenticação. ``` from py2neo import Graph g = Graph()

    Erro: AuthError: The client is unauthorized...

    
    Solução: As credenciais padrão são neo4j/password. Certifique-se de usar as suas.
    
    
    neo4j-client -u neo4j -p sua_senha bolt://localhost:7687 g = Graph(auth=("neo4j", "sua_senha"))
    
    Alternativamente, crie um novo usuário com o comando :server user add.
    
  • Erro ao criar relações via HTTP: Ao inicializar o Graph via HTTP, operações de criação podem falhar. ``` from py2neo import Graph, Node g_http = Graph("http://localhost:7474")

    Falhará ao tentar criar um nó

    
    Solução: Iniciailze usando o protocolo Bolt para operações de escrita.
    
    
    g_bolt = Graph("bolt://localhost:7687", auth=("neo4j", "sua_senha")) g_bolt.create(a) # Funciona corretamente
    
    

Instalação do Neo4j

O Neo4j requer Java 8. Instale as dependências necessárias:

sudo apt install openjdk-8-jdk
# Baixe e extraia a versão comunitária
wget https://dist.neo4j.org/neo4j-community-5.12.0-unix.tar.gz
tar -xzf neo4j-community-5.12.0-unix.tar.gz
cd neo4j-community-5.12.0/bin
./neo4j console

Para iniciar em segundo plano: ./neo4j start. O console ficará disponível em http://localhost:7474. As credenciais iniciais são neo4j/neo4j, e a alteração será solicitada no primeiro acesso.

Conceitos Básicos de Grafos

Um grafo é composto por:

  • Nós (Nodes): Representam entidades (ex: pessoa, produto). Na linguagem Cypher: (p:Person {nome: "Ana"})
  • Relacionamentos (Relationships): Conectam nós e têm direção e tipo. Ex: (p1)-[:CONHECE]->(p2)
  • Propriedades (Properties): Pares chave-valor em nós e relacionamentos. Ex: (p:Person {nome: "Ana", idade: 30})
  • Rótulos (Labels): Agrupam nós por tipo. Um nó pode ter múltiplos rótulos. Ex: (p:Person:Funcionario)

Fundamentos da Linguagem Cypher

Criação de Dados

Criar um nó simples:

CREATE (n:Aluno {matricula: 123, curso: "Ciência da Computação"})
RETURN n

Criar dois nós e um relacionamento:

CREATE (disciplina:Disciplina {codigo: "CC101", nome: "Banco de Dados"})
CREATE (professor:Professor {nome: "Carlos"})
CREATE (professor)-[:LECIONA {semestre: "2023/1"}]->(disciplina)
RETURN professor, disciplina

Consultas com MATCH

O MATCH busca por padrões no grafo.

Encontrar todos os alunos:

RETURN (aluno:Aluno) RETURN aluno

Encontrar alunos por uma condição específica:

MATCH (aluno:Aluno)
WHERE aluno.curso = "Engenharia de Software"
RETURN aluno.nome, aluno.matricula

Buscar relacionamentos específicos:

MATCH (prof:Professor)-[:LECIONA]->(disc:Disciplina)
WHERE prof.nome = "Carlos"
RETURN prof.nome AS Professor, disc.nome AS Disciplina

Subconsultas e Recomendações

Exemplo de rceomendação: Encontrar alunos que cursaram a mesma disciplina que um aluno específico, mas que ele ainda não cursou.

MATCH (aluno1:Aluno {nome: "Maria"})-[:CURSOU]->(disc:Disciplina)<-[:CURSOU]-(outroAluno:Aluno)
WHERE NOT (aluno1)-[:CURSOU]->()<-[:CURSOU]-(outroAluno) AND aluno1 <> outroAluno
RETURN outroAluno.nome AS Recomendacao, COUNT(DISTINCT disc) AS DisciplinasEmComum
ORDER BY DisciplinasEmComum DESC
LIMIT 5

Índices e Restrições

Criar um índice para acelerar consultas por nome de aluno:

CREATE INDEX INDEX_ALUNO_NOME FOR (a:Aluno) ON (a.nome)

Criar uma restrição de unicidade para a matrícula:

CREATE CONSTRAINT CONSTRAINT_ALUNO_MATRICULA FOR (a:Aluno) REQUIRE a.matricula IS UNIQUE

Consultas que filtram por nome ou matrícula agora utilizarão os índices automaticamente, resultando em melhor desempenho.

Algoritmos e Extensões

A biblioteca APOC pode ser usada para algoritmos avançados. Exemplo para calcular a centralidade de PageRank:

CALL algo.pageRank.stream('Aluno', 'CONHECE', {iterations:20, dampingFactor:0.85})
YIELD nodeId, score
RETURN algo.asNode(nodeId).nome AS nome, score
ORDER BY score DESC

Para uso em Python, a biblioteca py2neo fornece uma integração orientada a objetos:

from py2neo.ogm import GraphObject, Property, RelatedTo

class Aluno(GraphObject):
    __primarykey__ = 'matricula'
    nome = Property()
    matricula = Property()
    cursou = RelatedTo("Disciplina")

# Conexão e consulta usando OGM
graph = Graph("bolt://localhost:7687", auth=("neo4j", "senha"))
maria = Aluno.match(graph).where("_.nome = 'Maria'").first()
print(maria.nome, maria.matricula)

Tags: neo4j Cypher Banco de Dados de Grafos py2neo OGM

Publicado em 6-27 02:13