Dando continuidade aos posts sobre bancos
de dados NoSQL, apresento-lhes um dos modelos mais interessantes. O Graph database
(ou Property Graph data model).
Um graph é desenhado para armazenar dados
que naturalmente podem ser estruturados em forma gráfica. Um rede social é um
exemplo típico, onde temos usuários que se conectam entre si de varias maneiras
(amigo, seguidor, etc..) e se conectam com outras coisas como idéias,
posts, produtos (curtir, seguir, etc..)
Outros bons exemplos são hieraquias, organogramas
e aplicações para web semântica
Fig.1
– Modelando minha familia
Ao invés de tabelas, colunas e
relacionamentos, um banco de dados graph é composto por nós (ou vertex),
properties e relacionamentos (ou edges).
Um nó é um objeto que possui propriedades. Exemplo: Em um
e-commerce de livros, os nós podem ser Livros, Autores e Editoras. Os Livros podem ser descritos em
propriedades como Titulo, Genero, Preço, número de paginas. Os autores
possuirão Nome, data de Nascimento, biografia, etc...
Os relacionamentos estabelecem as relações
entre os nós. Exemplo: Escrito_por, Editado_por ou É_autor_de.
Propriedades também podem ser adicionadas
ao relacionamentos, exemplo: Relacionamento Gosta_de, Intensidade: Muito)
Ferramentas
A ferramenta que usaremos no exemplo
abaixo é o Neo4J que pode ser baixando gratuitamente aqui. O Neo4J é uma implementação do BluePrints que por sua vez é uma API genérica para modelos gráficos. Outras implementações do BluePrints são TinkerGraph, OrientDB, DEX, InfiniteGraph, Rexster, e SailRDFStores
A linguagem que usaremos para manipular o banco é a Gremlin, que é baseada em Groovy e Pipes. Mas existem muitas formas de fazer esse acesso (REST, Cypher). O ideal novamente é sempre escolher a ferramenta certa para a função certa.
Nota: Eu até peço desculpas pela avalanche de nomes e siglas desse tópico, isso deixa qualquer iniciante confuso, principalmente o pessoal que vem do mundo relacional onde os produtos estão bem mais consolidados e simplificados, mas é importante ter noção completa de tudo o que envolve o Graph database principalmente se você for implementa-lo em uma aplicação no mundo real.
Criando um graph
Se seu OS for Windows, basta baixar o
pacote do Neo4J, descompactá-lo e executar o Neo4J.bat que está na pasta Bin.
Ele rodará o script e abrirá uma janela
java (é o serviço rodando)
O Neo4J ao iniciar te disponibiliza uma
interface web hospedada na sua máquina. O caminho padrão para acesso é o http://localhost:7474/webadmin/
Para inserir o
nó clique na aba Console e selecione a linguagem Gremlin no canto superior
direito.
Inserindo nós, propriedades e listando.
Vamos criar uma rede social basica, os nós serão os usuários e o unico relacionamento possivel é CONHECER.
Segue código para adicionar algumas pessoas (pequena homenagem a alguns amigos visitantes)
Logo após a ASCII Art do Gremlin o webadmin já carrega a variagel g que representa o gráfico.
Na sequencia usamos a função addVertex para adicionar o primeiro nó.
(g.addVertex)
As properties do nó são passadas como parâmetro (um JSON), que basicamente
tem essa estrutura
[Nome_da_Propriedade:Valor_Da_Propriedade, ...]
É interessante notar que diferente do banco relacional que possue um
schema fixo de colunas, as propriedades de cada nó podem variar, existindo ou
não. Todo noSQL é schemaless.
Para listar os nós, simplesmente use g.V, onde V é a coleção de Vertices
dentro do grafico g. A lista exibirá apenas os nós, voce pode pedir
para exibir os nomes usando g.V.Nome, ou g.V.Qualquer_propriedade que voce_tenha criado.
Notamos que a profissão do Bruno Salim está com a grafia errada (foi de
propósito, juro). Vamos fazer o update então. Note que o ID do nó dele é 28.
Simples assim. Assim como é fácil adicionar novas propriedades. Por
Exemplo, no caso do Gustavo que foi adicionado sem uma profissão.
Ou adicionar uma nova propriedade que nem estava na inicialização (essa é
a característica do schemaless)
Agora vamos estabelecer as relações entre os usuários atrávés do
relacionamento CONHECE.
Na primeira parte atribuimos os nós a variaveis com nomes mais amigáveis,
na segunda adicionamos os relacionamentos(edges) CONHECE entre eles.
Com o Gráfico criado vamos começar a responder algumas consultas típicas
das redes sociais e perceber o poder do graph db.
As consultas do
Gremlin são feitas em passos divididos pelo ponto.
Objeto.passo1.passo2.passoN.propriedade
O passo usa o resultado do passo anterior e pode transforma-lo, filtra-lo
ou o chamado sideeffect usado para agregações.
Então vamos as consultas!
Quem eu conheço?
O
objeto Felipe é o nó correspondente a mim, usamos o passo out que retorna todos
os nós que recebem edges de saída do nó Felipe.
Quem são os amigos de meus amigos?
Uma forma de evitar o uso do out repetidas vezes
é usando ó pasos loop, que repete o passo anterior até que a regra entre
colchetes não seja mais satisfeita (no caso limitando a duas vezes o numero de
iterações do loop)
Através de quem Felipe pode conhecer Gustavo?
Essa é uma das mais interessantes propriedades dos graphs, responder esse tipo de pergunta em um modelo relacional é muito dificil e inevitavelmente geraria uma consulta muito pesada e isso seria fatal para uma aplicação web com muitos usuários. A vantagem do graph é que independentemente da quantidade de nós e iterações a resposta para essa pergunta mantém a mesma velocidade.
A condição para o loop foi que ele não parasse enquanto não encontrasse o nó referente ao gustavo. Assim ele me apresentou dois caminhos possiveis.
Podemos também trocar o out por uma combinação de outE (relacionamentos de saida) e inV (para obter os nós) e termos como esses nós se relacionam
Como existem dois caminhos possiveis Vamos remover o link entre Spigariol e Gustavo e tentar novamente
Na primeira linha a identificação do relacionamento, 'g.E' para listar
todos os edges, seguido de 'inV' para pegar os nós retornados e 'has' para
filtrar aqueles com nome Gustavo. E por fim, um back(2),
para exibir os resultados de dois passos atras. (voltando no E).
A remoção e novamente o comando
para listar o caminho entre os dois nós.
Conclusão
Fizemos um pequeno tour sobre o que é o GraphDB, quais são as peças que
você deve juntar para usá-lo e uma lab "mão na massa" de como criar,
apagar e consultar os nós armazenados. Apesar de extenso, esse post está muito
longe de ser um tutorial completo, para isso recomendo esse ótimo video tutorial, onde o analista Andreas Kollegger <twitter>; faz toda uma demonstração da aplicação. Um
dos pontos que achei mais interessantes é quando ele diz que um banco
relacional é ótimo para calcular a média de salário das pessoas presentes na
conferência, mas o banco de dados gráfico será o melhor para responder quem
dali estaria mais apto a lhe pagaria uma cerveja.
Enfim obrigado por ler até aqui, se você ficou com alguma dúvida fique a
vontade para me encaminhar um email, ou me siga no twitter onde sempre tento
postar links e materias interessantes desse nosso maravilhoso mundo dos dados!
Abraços!
Felipe Antunes
email:fjantunes@gmail.com
twitter: @felipe_store















