DEV Community 👩‍💻👨‍💻

Cover image for 🔵Primeiros passos com Neo4j e Cypher
Maiqui Tomé 🇧🇷
Maiqui Tomé 🇧🇷

Posted on • Updated on

🔵Primeiros passos com Neo4j e Cypher

Neste post vamos aprender a dar os primeiros passos com o banco de dados orientado à grafos Neo4j e sobre sua linguagem de conculta Cypher.

O que são grafos?

Image description

Conforme a Wikipédia, a teoria dos grafos ou de grafos é um ramo da matemática que estuda as relações entre os objetos de um determinado conjunto. Para tal são utilizadas estruturas chamadas grafos, G(V,E), onde V é um conjunto não vazio de objetos denominados vértices (ou nós) e E (do inglês edges - arestas) é um subconjunto de pares não ordenados de V.

Relacionamentos (Arestas)

Neo4j é usado muito em rede de buscas e recomendações. Por exemplo, você busca um filme na Netflix e, de acordo com esse filme, você obtêm recomendações.

Image description

Base de exemplo Movie Graph

Para as próximas etapas você precisa ter o Neo4j Desktop instalado.

Clique em start:
Image description

Clique em open:
Image description

Clique em cada passo:
Image description

O comando :play movie-graph foi programado para mostrar a tela abaixo:

Image description

Após clicar na seta ao lado, é mostrado o comando para criar toda a base de dados. Você pode rodar o comando de duas maneiras:

  1. Você pode clicar direto no play:

Image description

  1. Ou você pode clicar no comando e depois no play:

Image description

Após teremos os seguintes dados:

Image description

Propriedades de um nó e de um relacionamento

Label e propriedades de um nó:

Image description

Comparando com um banco de dados relacional, a Label é como se fosse o nome de uma tabela e, as propriedades, como se fossem as colunas de uma tabela. As propriedades podem diferir em cada nó, pois o Neo4j não é um banco de dados estruturado e, sim, um banco de dados nosql.

Tipos de relacionamento e suas propriedades:

Image description

Após uma consulta, o resultado abaixo apresenta dois Node Labels e dois Relationship Types:

Image description

Linguagem de Consulta Cypher

Cypher é a linguagem de consulta de gráficos do Neo4j que permite recuperar dados do gráfico. Inspirado pelo SQL, permite que você se concentre em quais dados você deseja do gráfico (não em como obtê-los). É a linguagem gráfica mais fácil de aprender devido a sua semelhança com outras linguagens e intuitividade.

Image description

Principais palavras da linguagem Cypher

Você pode executar o comando Neo4j$ :help cypher:

Image description

  • CREATE - Cria nodes e relacionamentos;
  • MATCH - Parecido com o comando select do banco de dados relacional;
  • RETURN - Mostra (retorna) o valor criado;
  • WHERE - Seleciona dados através de uma determinada condição;
  • SET - Atualização;
  • REMOVE - Deleção;
  • MERGE - Cria um objeto derivado de algum node.

Guardando comandos (favoritando)

Você pode guardar comandos que mais utiliza:

Image description

Para salvar um comando é só clicar no play para executar ele e depois clicar na estrela:

Image description

Salve o comando de buscar todos os dados:

MATCH (n) DETACH DELETE n
Enter fullscreen mode Exit fullscreen mode

E salve o comando de deletar todos os dados:

MATCH (n) RETURN n
Enter fullscreen mode Exit fullscreen mode

Criando nós (nodes)

Primeiro vamos deletar todos os dados do exemplo Movie Graph com o comando:

MATCH (n) DETACH DELETE n
Enter fullscreen mode Exit fullscreen mode

Não podemos ter relacionamentos se não tivermos nós. Então, vamos criar por primeiro os nós.

Criando um nó apenas com id

Os parenteses () representam um nó.

Execute o comando CREATE () para criar um nó:

CREATE ()
Enter fullscreen mode Exit fullscreen mode

Já temos um nó criado, mas sem label e apenas com a propriedade id. Para buscar todas as informações utilize o comando:

MATCH (n) RETURN n
Enter fullscreen mode Exit fullscreen mode

Observamos que o nosso nó só tem id:

Image description

Podemos já criar o node e retorná-lo com o comando:

CREATE (n) RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Agora temos um nó com o id 1. O n é uma variável (representando um nó) criada em tempo de execução e não será guardada em memória para ser utilizada depois; você pode colocar qualquer nome no lugar de n.

Se selecionarmos todos os dados teremos dois nós, um com id 0 e outro com id 1:

Image description

Criando um nó com label

  1. Tudo que for criado para o nó será colocado dentro de ().
  2. Dentro de (), a variável vem sempre primeiro.
  3. Case sensitive: a label Time diferirá da label time.
CREATE (n :Time) RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Se você rodar esse comando mais duas vezes teremos três times:

Image description

Criando um nó com duas labels:

CREATE (n :Time :Basquete) RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Agora temos quatro times e um deles é de basquete:
Image description

Criando um nó com propriedades

As propriedades são criadas dentro de {}.

Criando e retornando com a variável n:

CREATE (n :Time :Futebol {nome: 'Internacional', cor: 'Vermelho e Branco'}) RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Criando, mas sem retornar:

CREATE (:Time :Futebol {nome: 'Grêmio', cor: 'Azul e Preto'})
Enter fullscreen mode Exit fullscreen mode

Image description

Escolhendo como o nó deve aparecer

Nossos nós estão mostrando as informações das cores, mas se eu quiser que apareça o nome do time ao invés das cores?

Clique na label:
Image description

Clique em nome:
Image description

Você pode trocar a cor e o tamanho do nó:
Image description

Usando o comando WHERE

Antes de usarmos o comando WHERE vamos vizualizar todos os dados:

MATCH (n) RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Filtrando por id:

Image description

MATCH (n) WHERE id(n) = 6 RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Filtrando por label:

MATCH (n :Time) RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

MATCH (n :Time :Futebol) RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Filtrando por propriedade:

Somente o id, criado automaticamente pelo Neo4j, será buscado com parenteses id(); as outras propriedades será por notação de ponto.

MATCH (n) WHERE n.nome = 'Internacional' RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Filtrando por label e propriedade:

MATCH (n :Time :Futebol) WHERE n.nome = 'Internacional' RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Filtrando dois nós:

MATCH (i),(g) WHERE i.nome = 'Internacional' AND g.nome = 'Grêmio' RETURN i, g
Enter fullscreen mode Exit fullscreen mode

Image description

ou com label:

MATCH (i :Time),(g :Futebol) WHERE i.nome = 'Internacional' AND g.nome = 'Grêmio' RETURN i, g
Enter fullscreen mode Exit fullscreen mode

Criando nós estruturados

Primeiramente vamos apagar todos os dados com o comando de deleção que adicionamos nos favoritos.

Criando seleções de futebol

CREATE (:Selecao {nome: 'Brasil', cor: 'Verde, Amarelo'})

CREATE (:Selecao {nome: 'Argentina', cor: 'Azul, Branco'})

CREATE (:Selecao {nome: 'Uruguai', cor: 'Azul, Branco'})

CREATE (:Selecao {nome: 'Franca', cor: 'Azul, Branco, Vermelho'})

CREATE (:Selecao {nome: 'Espanha', cor: 'Amarelo, Vermelho'})

CREATE (:Selecao {nome: 'Alemanha', cor: 'Amarelo, Vermelho, Preto'})

CREATE (:Selecao {nome: 'Inglaterra', cor: 'Vermelho, Branco'})

CREATE (:Selecao {nome: 'Italia', cor: 'Verde, Vermelho, Branco'})

CREATE (:Selecao {nome: 'EUA', cor: 'Azul, Vermelho, Branco'})

CREATE (:Selecao {nome: 'Japao', cor: 'Vermelho, Branco'})

CREATE (:Selecao {nome: 'Nigeria', cor: 'Verde, Branco'})

CREATE (:Selecao {nome: 'Canada', cor: 'Vermelho, Branco'})

CREATE (:Selecao {nome: 'Colombia', cor: 'Amarelo, Vermelho, Azul'})
Enter fullscreen mode Exit fullscreen mode

Criando continentes

CREATE (:Continente {nome: 'America do Sul'})

CREATE (:Continente {nome: 'America do Norte'})

CREATE (:Continente {nome: 'Europa'})

CREATE (:Continente {nome: 'Africa'})

CREATE (:Continente {nome: 'Asia'})
Enter fullscreen mode Exit fullscreen mode

Usando o comando CONTAINS

No comando abaixo trazemos todas as seleções que contém as cores vermelho e branco:

MATCH (n) WHERE n.cor CONTAINS 'Vermelho' AND n.cor CONTAINS 'Branco' RETURN n
Enter fullscreen mode Exit fullscreen mode

Image description

Criando relacionamentos (arestas)

Vamos criar um relacionamento entre Brasil e América de Sul.

MATCH (s :Selecao),(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
RETURN s, c
Enter fullscreen mode Exit fullscreen mode

Image description

Criando o relacionamnto Brasil pertence a América do Sul:

MATCH (s :Selecao),(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
CREATE (s)-[r : Pertence]->(c)
RETURN s, c, r
Enter fullscreen mode Exit fullscreen mode

Image description

Relacionamento bidirecional

Como já comentamos, tente evitar o relacionamento bidirecional e nunca cria-lo sem uma real necessidade.

MATCH (s :Selecao),(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
CREATE (s)<-[r : Contem]-(c)
RETURN s, c, r
Enter fullscreen mode Exit fullscreen mode

Image description

Pesquisando relacionamentos

Sem especificar relacionamentos

Quando fazemos uma consulta e existem relacionamentos, os relacionamentos aparecem automaticamente:

MATCH (s :Selecao),(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
RETURN s, c
Enter fullscreen mode Exit fullscreen mode

Image description

Especificando relacionamentos

MATCH (s :Selecao)-[r :Pertence]->(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
RETURN s, c
Enter fullscreen mode Exit fullscreen mode

Image description

Apagando relacionamentos (arestas)

Antes de apagar, sempre faça a consulta para se certificar que a informação é realmente a informação que você deseja apagar:

MATCH (s :Selecao),(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
RETURN s, c
Enter fullscreen mode Exit fullscreen mode

O relacionamento aparece, mas pra podermos apagar o relacionamento precisamos informá-lo na consulta:

MATCH (s :Selecao)-[r :Pertence]->(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
DELETE r
RETURN s, c
Enter fullscreen mode Exit fullscreen mode

Image description

Para apagar o Contem é só inverter a direção da seta:

MATCH (s :Selecao)<-[r :Contem]-(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
DELETE r
RETURN s, c
Enter fullscreen mode Exit fullscreen mode

Image description

Usando o comando MERGE

O comando MERGE funciona parecido com o comando CREATE, porém, ao contrário do CREATE, o MERGE não vai repetir a criação se já existir. Por fazer essa verificação, o MERGE é menos performatico.

No código abaixo apenas trocamos o CREATE pelo MERGE:

MATCH (s :Selecao),(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
MERGE (s)-[r : Pertence]->(c)
RETURN s, c, r
Enter fullscreen mode Exit fullscreen mode

Image description

Se rodarmos o mesmo comando, o relacionamento Pertence não será criado novamente, ao contrário do comando CREATE que criaria mais um relacionamento chamado Pertence.

Tarefa

Como tarefa você pode criar os outros relacionamentos. O comando é o mesmo pra todos. Tente criar os comandos de cabeça sem copiar e colar.

  1. Faça a pesquisa dos nós que você quer adicionar o relacionamento.
  2. Faça a criação do relacionamento usando CREATE ou MERGE.

Top comments (0)

🤔 Did you know?

 
🌚 Dark mode is available in Settings.