DEV Community

loading...
Cover image for Introdução ao  NEO4J

Introdução ao NEO4J

renato_zero6 profile image Renato Rebouças ・3 min read

O que é o Neo4j?

O neo4j é um banco NoSql que utiliza a teoria de grafos e o cypher como sua linguagem oficial ao invés do sql, para poder criar um modelo menos genérico que os bancos relacionais, ou seja nele não precisamos de um design de tabelas para podermos popular o banco.

Definições

Nó (node)

É responsável por guardar os dados de uma entidade, podendo ter mais de uma propriedade, mas podendo ter apenas um label.

Relação (relationship)

A relação fica responsável de gravar a relação de um com o outro, por exemplo um autor pode ter uma relação com o livro.

Explicando principais comandos

  • MATCH: usado para dizer qual nó iremos buscar, pode se dizer que é o comando SELECT muito usado num banco relacional.
  • CREATE : responsável por criar nós e relacionamentos entre eles.
  • MERGE : utilizado para criar nós em relações quando eles não existem.
  • SET : muda as propriedades de uma relação ou nó.
  • RETURN: traz os resultados das consultas.
  • REMOVE: remove uma propriedade de um nó ou relação. Também serve para remover um label do nó.
  • WITH: serve para expor o resultado de um MATCH anterior para um próximo MATCH ou talvez, para um RETURN um pouco mais complexo. É a chave para quebrar patterns complexos em queries menores possivelmente mais rápidas.

Exemplos de uso dos comandos Cypher

Cria nó sem label

create()
Enter fullscreen mode Exit fullscreen mode

Retorna todos os nós

match (no) 
return no 
Enter fullscreen mode Exit fullscreen mode

Cria nó com valor nome

create ({nome: "Doriana"}) 
Enter fullscreen mode Exit fullscreen mode

Retorna nó com o valor especificado

match(no {nome: "Doriana"}  ) 
return no
Enter fullscreen mode Exit fullscreen mode

Deleta o nó da variável, ou seja deleta tudo!

match (no)
delete no
Enter fullscreen mode Exit fullscreen mode

Cria um label para um nó

create (:Pessoa {nome: "Asdrubal"}) 
Enter fullscreen mode Exit fullscreen mode

Filtra pelo um label especifico

match (n:Pessoa) return n
Enter fullscreen mode Exit fullscreen mode

Filtra pelo label pessoa e seta a quantidade de dados que se trás da consulta

match (n:Pessoa) 
return n 
limit 1
Enter fullscreen mode Exit fullscreen mode

Criando um nó com uma aresta

A aresta é representada pelo sinal de --> dessa forma se cria uma aresta sem label,
no exemplo á baixo criamos uma aresta com label -[:Label]->

create(:Livro 
{titulo: "Alice"})
 -[:Autor]-> (:Pessoa {nome: "Lewis Caroll"})
Enter fullscreen mode Exit fullscreen mode

Criando uma query para associar uma aresta

Na query a baixo criamos duas variáveis e associamos uma aresta a elas:

match (asd:Pessoa {nome: 'Asdrubal'}) 
match (al:Livro {titulo: 'Alice'})
create(asd) -[:Leu]-> (al)

Enter fullscreen mode Exit fullscreen mode

Associando todas pessoas a um livro

match (p:Pessoa) 
match (cc:Livro {titulo: 'Crime e Castigo'})
create(p) -[:Leu]-> (cc)
Enter fullscreen mode Exit fullscreen mode
create (:Pessoa {nome: "Lindaura"})
create (:Pessoa {nome: "Alcebiades"})
match (asd:Pessoa {nome: "Asdrubal"})
match (lind:Pessoa {nome: "Lindaura"})
match (guia:Livro {titulo: "Guia do mochileiro"})
match (hobit:Livro {titulo: "O Hobit"})
create (asd)-[:Leu]-> (guia)
create (asd)-[:Leu]-> (hobit)
create (lind)-[:Leu]-> (guia)
create (lind)-[:Leu]-> (hobit)
Enter fullscreen mode Exit fullscreen mode

Filtra as pessoas que já leram um livro x

match (p:Pessoa)
-[:Leu]-> (g:Livro {titulo:"Guia do mochileiro"})
return p
Enter fullscreen mode Exit fullscreen mode

Filtro com duas condições num mesmo Match

match (h:Livro{titulo: "O Hobit"})
<-[:Leu]-(p:Pessoa)
-[:Leu]-> (g:Livro {titulo:"Guia do mochileiro"})
return p
Enter fullscreen mode Exit fullscreen mode

Pegando todo mundo que leu Lewis Caroll

match (p:Pessoa)
-[:Leu]->(:Livro)-[:Autor]->
(:Pessoa {nome: "Lewis Caroll"})
return p
Enter fullscreen mode Exit fullscreen mode

Filtrando e trazendo livro e pessoa

match (p:Pessoa)-[:Leu]->
(l:Livro {titulo: "Crime e Castigo"})
return p,l
Enter fullscreen mode Exit fullscreen mode
match (p:Pessoa)-[:Leu]->(l:Livro)
<-[:Autor]-(n:Pessoa {nome:"Alcebiades"})
return p,l
Enter fullscreen mode Exit fullscreen mode

Usando um count na query

match (p:Pessoa)-[:Leu]->(l:Livro)
<-[:Autor]-(n:Pessoa {nome:"Alcebiades"})
return count(p)
Enter fullscreen mode Exit fullscreen mode
match (p:Pessoa)-[:Leu]->(l:Livro)
<-[:Autor]-(n:Pessoa {nome:"Alcebiades"})
return count(distinct p)
Enter fullscreen mode Exit fullscreen mode

Método merge

O merge verifica se a propriedade foi criada, se não foi criada ele cria, caso já exista você pode acrescentar o on e dizer oque le deve fazer:

match (p:Pessoa)-[:Leu]->(l:Livro)
<-[:Autor]-(n:Pessoa {nome:"Alcebiades"})
merge (p)-[lei:Leitor]->(n)
on create set lei.livros=1
on match set lei.livros=lei.livros+1
Enter fullscreen mode Exit fullscreen mode

Esse exemplo a baixo é um filtro trazendo a nova propriedade criada:

match (p:Pessoa)-[:Leu]->(l:Livro)
<-[:Autor]-(n:Pessoa {nome:"Alcebiades"})
match (p)-[lei:Leitor]->(d)
return p,l,lei,n
Enter fullscreen mode Exit fullscreen mode

Usando where e alterando dados de uma pessoa

match (p:Pessoa) where ID(p) = 10
set p.nome = 'João P'
return *
Enter fullscreen mode Exit fullscreen mode
Referências:

NEO4J — Primeiros passos

Uma gentil introdução ao uso de banco de dados orientados a grafos com Neo4j

Documentação neo4j

Discussion

pic
Editor guide
Collapse
diogosalmeida profile image
Diogo Santos Almeida

Interessante seu post, parabéns.