Neo4j una base de datos NoSQL orientada a grafos.

domingo, 30 de marzo de 2014

Neo4j

Neo4j es una base de datos open-source orientada a grafos, esta escrita en java y pertenece a este tipo de base de datos NOSQL que últimamente están tan en auge.

La página web es http://www.neo4j.org/, la documentación disponible es bastante completa.

Hay varios tipos de base de datos NOSQL:
  • Orientada a columnas
  • Clave-Valor
  • Big Table
  • Orientada a documentos
  • Orientada a grafos
Yo no pienso que este tipo de bases de datos hayan llegado para jubilar al SQL, sino más bien como complemento para una funcionalidad concreta donde se puede mejorar el rendimiento de una base de datos SQL.

Ahora mismo me parece bastante difícil que una aplicación grande como puede ser un ERP o una Web compleja con muchas funcionalidades tenga como única base de datos una NoSQL.

Uno de los problemas que tienen algunas de estas bases de datos es que no soportan trasacciones pero si suelen soportar operaciones atómicas.

¿Que es un grafo?

Un grafo estructura la información en forma de nodos y relaciones. Cuando pintamos en una pizarra un modelo de datos lo más natural es hacerlo en forma de grafo. Veamos un ejemplo:

En SQL definimos un esquema en forma de tablas, primarykeys y foreignkeys y cuando tenemos una relacion de n:m es necesario definir una tabla intermedia.

Ejemplo relacion n:m SQL


En Neo4j no se define ningún esquema, es schema-less, cada nodo o relación puede tener una estructura de datos diferente, lo que favorece la escalabilidad. Directamente se crean los datos y la forma de decirle los datos a neo4j es en json. Una vez creado el ejemplo anterior en Neo4j, quedaría así:

Ejemplo grafo en neo4j

Se acerca bastante más a las representación que tendríamos en el modelo de objetos en nuestro código.

Otro ejemplo que encaja muy bien en la forma de modelar datos de Neo4j, es una estructura jerárquica, que claramente es un grafo. En SQL hay varias soluciones como tener que cada registro apunte a su parent, pero no es tan óptimo como con Neo4j, donde modelar un árbol encaja de forma natural.

Neo4j tiene las siguientes carácteristicas:
  • No hay esquema
  • Transacciones ACID
  • Puede contener billiones de nodos y relaciones
  • Rápido recorriendo relaciones, este tipo de queries se conoce como transversals
  • Lenguaje de query propio, Cypher
  • Alta disponibilidad, instalación en diferentes maquinas con balanceador de carga
  • Multilenguaje, proporciona una Api Rest pudiendo utilizarse desde cualquier lenguaje. Lenguaje drivers disponibles

Donde Neo4j marca claramente la diferencia es cuando tiene que recorrer relaciones en un volumen de datos grande, voy a intentar explicar porque puede realizar estas queries tan rápido.

Procesamiento en grafo de forma nativa (Native Graph processing) Tiene index-free adjancency, cada nodo tiene una referencia directa a su nodo adyacente, esto provoca que el tiempo de una query no depende del tamaño total de la base de datos sino al área de búsqueda del grafo. Esta característica es clave para un alto rendimiento en las queries

Almacenamiento en grafo de forma nativa (Native Graph Storage) Hay ficheros para nodos, relaciones y propiedades. Al estar las propiedades de cada nodo y relación almacenado en un fichero diferente, el almacenamiento de nodos y relaciones se preocupa sólo de la estructura del grafo. Los tamaños son fijos y se puede obtener rápidamente en memoria nodos en base a su id, porque se sabe exactamente en que posición se encuentra este.

Por este motivo neo4j es muy válido para soluciones tipo red social, sistemas de recomendación, mapas topográficos, averiguar camino mas corto entre dos puntos, donde la necesidad es la navegación óptima por los datos independientemente del volumen total.

En sql esto supondría muchos joins, y muchos joins con un volumen de datos grande supone mal rendimiento en sql porque si afecta el tamaño del volumen total de la base de datos en una query con muchos joins.

Libros Relacionados

Graph Databases
Neo4j in Action
A Programmatic Introduction to Neo4j

No hay comentarios:

Publicar un comentario