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?
- Base de exemplo Movie Graph
- Propriedades de um nó e de um relacionamento
- Linguagem de Consulta Cypher
- Criando nós (nodes)
- Criando relacionamentos (arestas)
O que são grafos?
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.
Base de exemplo Movie Graph
Para as próximas etapas você precisa ter o Neo4j Desktop instalado.
O comando :play movie-graph
foi programado para mostrar a tela abaixo:
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:
- Você pode clicar direto no play:
- Ou você pode clicar no comando e depois no play:
Após teremos os seguintes dados:
Propriedades de um nó e de um relacionamento
Label e propriedades de um nó:
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:
Após uma consulta, o resultado abaixo apresenta dois Node Labels
e dois Relationship Types
:
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.
Principais palavras da linguagem Cypher
Você pode executar o comando Neo4j$ :help cypher
:
-
CREATE
- Cria nodes e relacionamentos; -
MATCH
- Parecido com o comandoselect
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:
Para salvar um comando é só clicar no play para executar ele e depois clicar na estrela:
Salve o comando de buscar todos os dados:
MATCH (n) DETACH DELETE n
E salve o comando de deletar todos os dados:
MATCH (n) RETURN n
Criando nós (nodes)
Primeiro vamos deletar todos os dados do exemplo Movie Graph com o comando:
MATCH (n) DETACH DELETE n
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 ()
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
Observamos que o nosso nó só tem id:
Podemos já criar o node e retorná-lo com o comando:
CREATE (n) RETURN n
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
:
Criando um nó com label
- Tudo que for criado para o nó será colocado dentro de
()
. - Dentro de
()
, a variável vem sempre primeiro. -
Case sensitive: a label
Time
diferirá da labeltime
.
CREATE (n :Time) RETURN n
Se você rodar esse comando mais duas vezes teremos três times:
Criando um nó com duas labels:
CREATE (n :Time :Basquete) RETURN n
Agora temos quatro times e um deles é de basquete:
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
Criando, mas sem retornar:
CREATE (:Time :Futebol {nome: 'Grêmio', cor: 'Azul e Preto'})
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?
Você pode trocar a cor e o tamanho do nó:
Usando o comando WHERE
Antes de usarmos o comando WHERE vamos vizualizar todos os dados:
MATCH (n) RETURN n
Filtrando por id:
MATCH (n) WHERE id(n) = 6 RETURN n
Filtrando por label:
MATCH (n :Time) RETURN n
MATCH (n :Time :Futebol) RETURN n
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
Filtrando por label e propriedade:
MATCH (n :Time :Futebol) WHERE n.nome = 'Internacional' RETURN n
Filtrando dois nós:
MATCH (i),(g) WHERE i.nome = 'Internacional' AND g.nome = 'Grêmio' RETURN i, g
ou com label:
MATCH (i :Time),(g :Futebol) WHERE i.nome = 'Internacional' AND g.nome = 'Grêmio' RETURN i, g
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'})
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'})
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
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
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
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
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
Especificando relacionamentos
MATCH (s :Selecao)-[r :Pertence]->(c :Continente)
WHERE s.nome = 'Brasil' and c.nome = 'America do Sul'
RETURN s, c
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
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
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
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
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.
- Faça a pesquisa dos nós que você quer adicionar o relacionamento.
- Faça a criação do relacionamento usando CREATE ou MERGE.
Top comments (0)