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...
neo4j-client -u neo4j -p sua_senha bolt://localhost:7687 g = Graph(auth=("neo4j", "sua_senha"))Solução: As credenciais padrão são neo4j/password. Certifique-se de usar as suas.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ó
g_bolt = Graph("bolt://localhost:7687", auth=("neo4j", "sua_senha")) g_bolt.create(a) # Funciona corretamenteSolução: Iniciailze usando o protocolo Bolt para operações de escrita.
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)