25 de jul de 2012

Por que utilizar Graph Database/Neo4j?

Anteriormente postei um artigo mostrando como criar um projeto utilizando neo4j como banco de dados. Mas além de saber esses primeiros passos é necessário saber em que sistemas é bom utilizar o Neo4j, e esta é a intenção deste post.



Inicialmente ja adianto algumas limitações do Neo4j, como Triggers iguais aos bancos de dados, procedures, entre outros. Mas, como todos sabemos, não é boa prática manter lógica de negocio implementada no banco de dados. Pois caso seja realizado a troca da base haverá problemas para a migração do mesmo. De qualquer forma o Neo4J possui recursos como TransactionEventHandler para tratar estes casos.

Outra pergunta que surge, sempre que falamos em uma base de dados NoSQl : "È possível migrar uma base de dados comum para uma base de dados utilizando Neo4J?"

Sim, suponhamos uma base de dados comum que pode ser representada pelo DER :

Um usuário do tipo A que possui um profile B pode publicar noticias C do tipo D.
Um exemplo seria, o usuário possui um relacionamento do tipo TIPO_NOTICIA  com a noticia. O usuário possui um relacionamento com profile e com user_type.
Gerando um grafo com um nó a menos:

Claro que este foi um exemplo bem simples, mas basicamente o algoritmo seria transformar os relacionamentos SQL para relacionamentos no grafo. Como o Neo4J permite que um relacionamento tenha atributos, o problema de relaciomamentos NxN é resolvido facilmente.

A grande facilidade de utilizar grafo, é na busca. Tomamos como exemplo que queremos achar todos  os usuários que editaram e postaram uma noticia, automaticamente pegariamos todos os nodes que tem relacionamento do tipo notice_type com noticia. Estas buscas podem ser feitas automaticamente utilizando scripts de busca, o mais comum é o cypher (em breve um post mostrando).

 Devido a esta facilidade, fica claro que quanto mais relaciomentos houver em um banco, melhor o grafo é aplicado. Tomamos como exemplo um sistema de uma locadora de filmes. Onde o usuário clica no ator e pega os filmes que ele fez, a partir de um filme pega outros atores ou as categorias dele e a partir disto encontra outro filme relacionado.  Para fazer este tipo de operação utilizando SQL é de certa forma complicado, mas utilizando grafo torna-se trivial.


Atualmente é comum um sistema com diversas base de dados com dados replicados, então se existe um grande sistema onde há uma área destinada a busca é bom pensar em utilizar uma base de dados para a mesma. O custo das buscas para nodes do mesmo tipo é linear, pois é possível utilizar sistemas de indices que também serão mostrados em outras postagens.

Portanto caso você esteja pensando em criar um sistema com grande quantidade de relacionamento entre as entidades cultive esta ideia.


3 comentários: