Iniciando com banco de dados gráfico e aplicações com Neo4j
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.
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
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:
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 nó 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.
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.
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 nó 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