Iniciando com banco de dados gráfico e aplicações com Neo4j

Beatrice Victoria
RealizeIT
Published in
5 min readJul 19, 2019

Este artigo parte de uma necessidade relatada por meus alunos em encontrar bons conteúdos de banco de dados orientado a grafos para iniciantes e suas aplicações em contextos reais. Espero que gostem.

Começando do começo…

O que são grafos?

Matematicamente falando, um grafo é uma estrutura equivalente a um conjunto de objetos onde alguns pares desses objetos são relacionados de alguma forma. Segundo a teoria dos grafos, os objetos são abstrações matemáticas chamadas de vértices (em banco de dados chamaremos de nós). Esses vértices são unidades fundamentais na formação dos grafos, assim como as arestas (que chamaremos de relacionamentos) que os unem.

Representação de um grafo*

Problema — Abstração — Modelo — Solução

Tomamos ciência de um problema real -> Analisamos e abstraímos o problema -> Grafos como ferramenta de abstração -> Solução no domínio de grafos

Deus é mais

Resumindo…

Um grafo é um conjunto de vértices unidos pelas arestas podendo ter direção ou não.

\m/ Simples, não?

Tá, entendi tudo só não entendi uma coisa: ONDE EU APLICO ISSO?????

Eu poderia chegar dando um tapa na cara da sociedade e dizer que você já usa, indiretamente ou inconscientemente, e terminar esse post aqui; mas vou te contextualizar com um exemplo da vida real.

Vejamos aqui um exemplo de grafo:

Mapa aéreo*

A imagem anterior ilustra um mapa aéreo de uma companhia de viagem. Esse mapa informa todas as rotas dessa companhia. Se esses dados fossem descritos em formato de texto, o mesmo seria extenso e complicado demais para o usuário que vai receber essa informação. Com o grafo, visualizamos as informações rapidamente, uma vez que os dados são apresentados de forma visual e clara, não dando vez para ambiguidade.

Ok ok, grafos eu já domino… mas como colocá-lo em um contexto de banco de dados?

Diferentemente de um banco de dados relacional onde temos tabelas, colunas, tuplas e relacionamento entre tabelas, um banco de dados orientado a grafos é baseado em relacionamentos naturais. Cada representa uma entidade com um conjunto de propriedades key-value e cada aresta é um relacionamento que liga os nós, podendo haver sentido essa aresta ou não.

Conjunto de propriedades key-value

As vantagens de se utilizar um banco de dados orientado a grafos são inúmeras. Além do design e extrema simplicidade na visualização dos resultados, há também a facilidade na consulta, a flexibilidade de mudanças e a facilidade de comunicar o modelo para todos.

Como exemplo de um grafo ligado por arestas com sentindo, usarei o software da Amazon, o Amazon Neptune. Na imagem, o Amazon Neptune está armazenando as informações dos lugares, pessoas, obras e conectando todos esses por meio de relacionamentos naturais.

Exemplo: Monalisa está exposta no Louvre e foi criada por Leonardo da Vinci. Nesse exemplo a Monalisa, o Museu do Louvre e o Leonardo da Vinci são nós que representam entidades com suas respectivas informações. Agora, “está exposta no” e “foi criada por” são os relacionamentos que ligam esses nós.

Amazon neptune

Iniciando com Neo4j

Neo4j é um sistema de gerenciamento de banco de dados gráfico desenvolvido pela Neo4j, Inc.

É possível saber mais sobre ele e fazer o download aqui.

Só relembrando:

Nó: O Vértice que representa uma entidade com propriedades chave-valor.

Relacionamento: As arestas que conectam esses nós relacionando-os. E ah, esses relacionamentos podem conter propriedades também.

Bora lá então…

Os comandos que utilizaremos são:

Create: CREATE (n:Person { name: "Andy"})

Para criação de nós e relacionamentos.

Match: MATCH (n {name: "Andy"})

Similar ao select, o Match monta o padrão de busca trazendo os nós e as suas relações.

Return: RETURN n

Para retornar as consultas conforme o padrão solicitado

Mas sintam-se à vontade de testar e explorar outros comandos como:

Merge: Na criação de nós e relações quando não existentes na base de dados.

Set: Para mudar propriedades de nós ou relações

Delete: Para apagar um ou uma relação.

Remove: Para remover propriedades das relações ou de nós.

Entre outros…

Criando nós de usuários

CREATE (u1:Usuário {Nome: “Beatrice”, Id: 1 })
CREATE (u2:Usuário {Nome: “Mateus”, Id: 2 })
CREATE (u3:Usuário {Nome: “Pedro”, Id: 3 })
CREATE (u4:Usuário {Nome: “Wellynton”, Id: 4 })

Consultando nós

MATCH (u:Usuário) return *

Criando mais nós

CREATE (c1:Cidade {Nome: “Porto Alegre”})
CREATE (c2:Cidade {Nome: “Gravataí”})
CREATE (c3:Cidade {Nome: “Alvorada”})

Consultando os nós criados anteriormente e os criados agora

MATCH (u:Usuário), (c:Cidade) return *

Criando relações

Associando os usuários às suas respectivas cidades.

CREATE (u1)-[m00:Mora_Em {Sigla: “Gti”}]->(c2)
CREATE (u2)-[m01:Mora_Em {Sigla: “POA”}]->(c1)
CREATE (u3)-[m02:Mora_Em {Sigla: “POA”}]->(c1)
CREATE (u4)-[m03:Mora_Em {Sigla: “Alv”}]->(c3)

Relacionando os usuários que se conhecem

CREATE (u1)-[c01:Conhece ]->(u2)
CREATE (u1)-[c02:Conhece ]->(u3)
CREATE (u1)-[c03:Conhece ]->(u4)
CREATE (u3)-[c04:Conhece ]->(u4)

Fazendo uma busca específica

Buscando pelos usuários que moram em Porto Alegre

MATCH (n:Usuário)-[m:Mora_Em]->(c:Cidade{Nome: “Porto Alegre”}) return *

Concluindo

Apresentei de uma forma simples e rápida a implementação dos grafos porque uma vez que entendido o conceito de grafos e como aplicá-lo no neo4j, implementar projetos utilizando-os será muito simples. Não difere muito do que foi apresentado, o que vai mudar é o nível de complexidade dos relacionamentos e a quantidade de dados na sua base. Mas isso fica por sua conta.

Não podemos desconsiderar as vantagens de utilizar um banco desse tipo e sair um pouco fora da caixa dos banco de dados relacional e até dos nosql mais tradicionais. Isso claro, respeitando a necessidade do projeto.

Dúvidas e sugestões são muito bem vindas.

Se leu até aqui, obrigada.

Referências

Mapa aéreo: Grafos e suas aplicações

Representação de um grafo: Introdução às redes complexas

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

--

--

Beatrice Victoria
RealizeIT

💻 Engineer Manager 📓Postgraduate degree in IT management, team coaching and artificial intelligence 🦊 Dog lover