Bases de dados de grafos são Nosql, projetadas para dados altamente conectados e com relacionamentos dinâmicos, daí sua aplicação ser maioritariamente em redes sociais, mecanismos de recomendação e deteção de fraudes, para além de outros tipos de sistema complexos baseados em relacionamentos. Neste artigo vamos falar sobre bases de dados de grafos, especificamente o neo4j que utilizamos na VOID em alguns dos nossos produtos. Mas antes de falarmos de neo4j vamos introduzir com pequenos fundamentos de teoria de grafos, e vais perceber que é o conceito fundamental para entender e usar uma base de dados orientada a grafos. Vamos apenas trazer alguns conceitos relevantes e convenientes para explicação de neo4j.
O que é um grafo?

A literatura afirma que a teoria dos grafos começou na cidade de Konigsberg em 1736 pelo grande matemático suíço Leonhard Euler (1707-1783). A cidade era cortada pelo rio Pregel, que possuía duas ilhas (figura 1.1).
Como era muito complicado fazer o transporte de cargas e pessoas através de barcos, algumas pontes foram construídas para auxiliar neste deslocamento entre as ilhas e as duas margens. Após algum tempo as pessoas começaram a se perguntar se era possível sair de sua casa, passar por cada ponte exatamente uma vez e voltar para a segurança de seu lar.
Para resolver o problema, Euler montou um diagrama que representasse o mapa da cidade. Ele o fez da seguinte maneira: A cada ilha e margem ele associou a um ponto que chamaremos de vértice e a cada ponte uma ligação que chamaremos de aresta.

Com isso, ele obteve um diagrama (figura 1.2) com vários pontos (vértices) e algumas ligações (arestas) que denominamos um grafo. Para finalizar seu raciocínio, Euler percebeu que existiam vértices com exatamente três arestas incidentes. Por outro lado, como os moradores queriam atravessar cada ponte apenas uma vez, cada vértice deveria ter um número par arestas. Logo, se tornaria impossível fazer um percurso seguindo as regras impostas pelos moradores.
“De forma resumida pode-se dizer que grafo é um conjunto de vértices e arestas.“

Um grafo é resumidamente um par de conjuntos. Um conjunto de vértices (ou nós) e de arestas (ou arcos). Cada aresta é um par ordenado de vértices. O primeiro vértice do par é a ponta inicial da aresta e o segundo é a ponta final.
Por norma as arestas são direcionadas, isto é, existe uma direção na relação entre cada vértice da aresta.
Se dissermos que uma aresta tem a ponta inicial v e ponta final w, será denotada por v-w. Pode ainda existir uma relação w-v, totalmente independente da direção contrária, ou até mesmo não existir nenhuma relação. Por exemplo, se os vértices forem pessoas e as arestas o “gostar de outra pessoa”, pode acontecer a pessoa A gostar de B mas a pessoa B não gostar de A.
No caso de grafos não direcionados, existe uma relação obrigatória e simétrica para os dois lados, ou seja, numa relação v-w haverá sempre obrigatoriamente uma aresta w-v. Pegando no exemplo anterior, onde os vértices são pessoas, mas agora as arestas são “é familiar de outra pessoa”, a pessoa A é familiar de B e vice-versa.
Dada a enorme utilidade dos grafos como representações de conhecimento, existe toda uma área de Ciência de Computadores dedicada ao seu estudo e são inúmeros e muito importantes os algoritmos que manipulam grafos. Um exemplo é o famoso Algoritmo de Dijkstra, que encontra o caminho mais curto entre um vértice e todos os outros vértices, num grafo pesado. Existem muitos outros algoritmos para outras tarefas tais como maximizar o fluxo entre vértices ou encontrar a árvore mínima de suporte.
E como funciona uma base de dados orientada a Grafos?
O modelo baseia-se na teoria dos grafos. Os dados são representados como um conjunto de vértices (nós) conectados por arestas (relacionamentos), sendo que ambos (tanto os nós como os relacionamentos) podem conter propriedades (atributos) no formato de chave-valor. Os nós representam objetos e as arestas representam a forma como esses objetos se relacionam, formando caminhos [Robinson et al. 2013]. Os relacionamentos têm nomes e devem possuir uma direcão, ou seja, seguindo a lógica de grafo direcionado.
O que é neo4j e como funciona?
O Neo4j é o sistema de gerenciamento de bases de dados de grafos mais popular do mundo (DBMS) e é desenvolvido pela Neo Technology, Inc. Ele é usado por milhares de organizações, incluindo mais de 50 do Global 2000, em aplicativos de produção de missão crítica.
O Neo4j armazena e apresenta dados na forma de um grafo. Os dados são representados por nós e relacionamentos entre esses nós. Um banco de dados grafo armazena nós e relacionamentos em vez de tabelas ou documentos.
Neste caso a base de dados pode ser vista como um multigrafo rotulado e direcionado, onde cada par de nós pode ser conectado por mais de uma aresta. Um exemplo pode ser: “Quais cidades foram visitadas anteriormente por pessoas que viajaram para Maputo?”. Se pensarmos num modelo relacional esta consulta poderia ser muito complexa devido à necessidade de múltiplas junções, o que poderia significar uma diminuição no desempenho da aplicação. Porém, por causa dos relacionamentos inerentes aos grafos, estas consultas tornam-se mais simples e diretas. É ainda possível estabelecer relações de profundidade com alguma facilidade, como por exemplo na rede social Linkedin onde vemos o “grau” de conexões que nos distancia de outra pessoa.
Com o potencial dos grafos, alguns problemas práticos podem ser resolvidos facilmente, como por exemplo:
- Ajudar motores de busca a localizar informação relevante rapidamente.
- Detetar fraude em sistemas financeiros, nomeadamente nas transações entre entidades.
- Descobrir os melhores casamentos entre posições disponíveis em empresas e pessoas que aplicaram para as posições de interesse.
- Criar mecanismos de recomendação, baseados nos gostos pessoais dos clientes.
- Descobrir qual é o roteiro mais curto para visitar as cidades de uma região turística.
- E muitos mais, basta dar asas à imaginação. Onde existe uma relação entre dois objetos, existe a possibilidade de tirar partido do potencial de grafos.
Como utilizar neo4j usando Cypher?
Cypher é a linguagem de consulta de grafos do Neo4j que permite consultar dados do grafo. É similar ao SQL, mas para grafos, então permite que você se concentre em quais dados você deseja do grafo (não em como obtê-los), ou seja, é uma linguagem declarativa.
É a linguagem de grafos mais fácil de aprender por causa de sua semelhança com outras linguagens e intuitividade.

O Cypher é a linguagem oficial de consultas do neo4j e permite que se crie, modifique e procure dados numa estrutura baseada num grafo de informações e relacionamentos.
Conclusão
Como foi possível perceber, as bases de dados de grafos oferecem inúmeras vantagens e facilidades para a resolução de determinados problemas. Porém, pelo desconhecimento da tecnologia ou por estas não fazerem parte do tipo de bases de dados mais populares, muitos desenvolvedores e empresas acabam optando por outras soluções, que muitas vezes não se adequam da melhor forma ao problema a resolver, principalmente no nosso País.
Aqui na VOID utilizamos (e adoramos!) bases de dados de grafos mais concretamente o neo4j, em alguns dos nossos produtos, para resolver um conjunto diferente de problemas, como por exemplo conexões entre utilizadores, detecção de fraude, gestão de contactos, entre outros. Mas deixaremos para outro artigo os desafios que enfrentámos e como solucionámos através do neo4j.
Até lá, convidamos-te a sair da tua área de conforto e explorar o neo4j, quem sabe não acabas apaixonado 😉