NoSQL - Graph databases (Neo4J) ,ou o modelo gráfico!
Autor: Felipe Antunes | Publicado: 2012-05-23T17:04:00-07:00

For english version, please click here!

/* Olá Senhores,
senhoras e senhoritas DBAS!!!



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dando continuidade aos posts sobre bancos
de dados NoSQL, apresento-lhes um dos modelos mais interessantes. O Graph database
(ou Property Graph data model).


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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..) 


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Outros bons exemplos são hieraquias, organogramas
e aplicações para web semântica





 
 
  
  
  
  
  
  
  
  
  
  
  
  
 
 
 






Fig.1
– Modelando minha familia





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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&nbsp; 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...


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Os relacionamentos estabelecem as relações
entre os nós. Exemplo: Escrito_por, Editado_por ou É_autor_de.


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Propriedades também podem ser adicionadas
ao relacionamentos, exemplo: Relacionamento Gosta_de, Intensidade: Muito)


Ferramentas 



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A ferramenta que usaremos no exemplo
abaixo é o Neo4J que pode ser baixando gratuitamente aqui. O Neo4J é uma implementação do BluePrints que&nbsp;por sua vez é&nbsp;uma&nbsp;API genérica para modelos gráficos. Outras implementações do BluePrints são TinkerGraph, OrientDB, DEX, InfiniteGraph, Rexster, e SailRDFStores

&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A linguagem que usaremos para manipular o banco é a Gremlin, que é baseada em Groovy e Pipes.&nbsp;Mas&nbsp;existem muitas formas de fazer esse acesso (REST, Cypher).&nbsp;O&nbsp;ideal novamente é sempre escolher a ferramenta certa para a função certa.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



Nota: Eu até peço desculpas pela avalanche de nomes e siglas&nbsp;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 





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Se seu OS for Windows, basta baixar o
pacote do Neo4J, descompactá-lo e executar o Neo4J.bat que está na pasta Bin.


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ele rodará o script e abrirá uma janela
java (é o serviço rodando)


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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/











&nbsp;&nbsp; Para inserir o
nó clique na aba Console e selecione a linguagem Gremlin no canto superior
direito.



Inserindo nós, propriedades e listando.



&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;Vamos criar uma rede social basica, os nós serão os  usuários e o unico&nbsp; relacionamento possivel é CONHECER.



&nbsp;&nbsp; Segue código para adicionar algumas pessoas (pequena homenagem a alguns amigos visitantes)








&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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.&nbsp;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)







&nbsp;&nbsp;&nbsp;&nbsp; Aqui o map é uma exibição de todas as propriedades do&nbsp;nó em JSON&nbsp;




Relacionando os nós







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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.



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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? 



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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? 



&nbsp;&nbsp;&nbsp;&nbsp; Re-aplicando
o passo out, pegamos todos os nós resultantes do primeiro out e retornamos
novamente os nós que tem relacionamentos de saida.









&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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? 



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Essa é uma das mais interessantes propriedades dos graphs,&nbsp;responder esse tipo de pergunta em um modelo relacional&nbsp;é muito dificil e inevitavelmente geraria uma consulta muito pesada e isso seria fatal para uma aplicação web com muitos usuários.&nbsp;A vantagem do graph&nbsp;é que&nbsp;independentemente da quantidade de nós e iterações a resposta para essa pergunta mantém a mesma velocidade.





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp; 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.



&nbsp;&nbsp;&nbsp;&nbsp; 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







&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Como existem dois caminhos possiveis &nbsp;&nbsp;&nbsp; Vamos remover o link entre Spigariol e Gustavo e tentar novamente&nbsp;










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 &lt;twitter&gt;; 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