Fundamentos
En una base de datos orientadas a grafos, los datos se estructuran formando una serie de entidades denominadas nodos, que pueden está relacionadas entre sí. Cada nodo del grafo contiene una entidad de información, como un curso, un alumno, un empleado, etc., pudiéndose establecer unas líneas de relación entre estas entidades que permite conectar unos nodos con otros dentro del grafo.
Las bases de datos orientadas a grafos constituyen una de las cuatro categorías en las que se dividen las bases de datos NoSQL, ampliamente utilizadas en el mundo del Big Data.
Este tipo de bases de datos permiten representar información en la que existen relaciones complejas entre los elementos de información, como por ejemplo la información que se gestiona en una red social
Entre los beneficios que encontramos a la hora de utilizar una base de datos orientada a grafos están:
· Flexibilidad. Como en otros tipos de bases de datos NoSQL, las entidades, en este caso los nodos, no tienen una estructura rígida. Cada nodo puede tener propiedades diferentes y es sencillo añadir nuevas propiedades a un nodo
· Rendimiento. Las bases de datos orientadas a grafos como tienen mejor rendimiento que las relacionales (SQL) y las no relacionales orientadas a agregados. Y es que, en este tipo de bases de datos, durante la ejecución de las consultas se actúa sobre el nodo y la relaciones implicadas en esa búsqueda y no sobre todo el grafo completo, lo que optimiza mucho el proceso. Además, las bases de datos de grafo se indexan de forma natural por sus relaciones, proporcionando un acceso más rápido en comparación a cómo se realiza en una base de datos relacional a través de las foreign keys.
· Escalabilidad. Las bases de datos orientadas a grafos son altamente escalables pues ante las necesidades de aumento de datos, resulta muy sencillo añadir nuevos nodos y relaciones a un grafo ya existente.
Neo4J
Neo4j es una base de datos orientada a grafos creada por Neo Technology Inc. Actualmente, representa el tipo de base de datos orientada a grafos más utilizado.
Neo4 está implementada en Javay utiliza un grafo de propiedades etiquetado para el almacenamiento de los datos. En un grafo de propiedades etiquetado, los nodos se representan con unas etiquetasque permiten clasificar a los distintos nodos del árbol. Tanto nodos como relaciones se caracterizan por una serie de propiedades, en cuyos valores se alacena la información del grafo.
Entre las principales características de Neo4j destacamos:
· Soporta transacciones ACID
· Posibilidad de definir índices sobre las propiedades de los nodos
· Alta disponibilidad, balanceo de carga de lectura.
· Independientemente del tamaño de la red, la velocidad de las operaciones es constante.
Neo4j proporciona un lenguaje específico para la realización de consultassobre el grafo conocido como Cypher. Además, dispone de una API RESTque permite consultar y modificar los datos de la base de datos mediante peticiones HTTP.
Instalación de Neo4J
Neo4j se distribuye en dos ediciones: Community y Enterprise. A continuación, veremos como instalar la versión comunity. Para ello, accederemos al centro de descargas de Neo4j en la siguiente dirección:
https://neo4j.com/download-center/#community
Allí descargaremos el archivo comprimido correspondiente a nuestra versión de sistema operativo:
Para poder trabajar con neo4j será necesario tener instalado el JDK versión 7 o superior.
Una vez descargado y descomprimido el archivo, para iniciar el servidor de base de datos accedemos mediante línea de comandos a la carpeta bin del directorio donde se encuentra descomprimido Neo4j y ejecutamos el comando:
>neo4j console
Al iniciarse el servicio, nos aparecerá una información similar a la que se muestra en esta imagen:
Como vemos, se nos informa de que el acceso a la interfaz de administración de Neo4j se encuentra accesible en la dirección http://localhost:7474
Al entrar por primera vez en esa dirección, se nos pedirá que nos autentiquemos. Aparecerá ya introducido el nombre del usuario administrador «neo4j» y tendremos que introducir la contraseña correspondiente, que es también «neo4j». Después, el sistema nos solicitará un cambio en la contraseña de administrador y, tras ello, se mostrará la página de administración de neo4j. El aspecto de esta página se muestra en la siguiente imagen:
La interacción con neo4j la realizaremos a través de la línea de comandos. Desde esta podemos escribir instrucciones en lenguaje Cypher para realizar cualquier tipo de operación con el grafo, como crear nodos y relaciones, realizar consultas en grafo, modificación de propiedades, e incluso la eliminación de objetos del grafo.
Creación de un grafo
Vamos a ver como crear un grafo sencillo en neo4j. Para crear cualquier elemento del grafo, esto es, nodos y relaciones, tenemos que utilizar la sentencia «Create» del lenguaje Cypher. El formato de la instrucción Create para crear un nodo es el siguiente:
CREATE (alias:etiqueta{propiedad:valor,propiedad:valor})
El elemento aliaspermite asociar un identificador al nodo para poder referenciarlo en una instrucción posterior, mientras que etiquetarepresenta la categoría o tipo que le queremos asociar al nodo. A continuación de la etiqueta se indican las propiedades del nodo en formato JSON
Por su parte, la creación de una relación con la sentencia Create seguirá el siguiente formato:
CREATE (nodo1)-[:etiqueta_relacion {propiedad:valor,propiedad:valor}]->(nodo2)
Donde nodo1y nodo2son los alias de los nodos que vamos a relacionar y etiqueta_relaciones la categoría o tipo asociada a la relación. Como vemos, sobre una relación también se pueden definir propiedades
Las sentencias de creación de nodos y relaciones deben ejecutarse conjuntamente, como una única unidad de transacción.
Por ejemplo, vamos a crear un grafo en el que representemos una serie de cursos y alumnos, donde los alumnos se asocian a cursos mediante una relación de tipo Realiza. El conjunto de instrucciones que tendremos que incluir en la línea de comandos de la página de neo4j será el siguiente:
CREATE (java:Curso {curso:'Programación Java estándar', duracion:120, precio:80})
CREATE (angular:Curso {curso:'Angular', duracion:30, precio:110})
CREATE (spring:Curso {curso:'Spring', duracion:80, precio:200})
CREATE (pepe:Alumno {nombre:'Pepe', edad:20})
CREATE (ana:Alumno {nombre:'Ana', edad:40})
CREATE (elena:Alumno {nombre:'Elena', edad:34})
CREATE (mario:Alumno {nombre:'Mario', edad:19})
CREATE (pepe)-[:Realiza {horario:'Mañana'}]->(java)CREATE (pepe)-[:Realiza {horario:'Tarde'}]->(angular)CREATE (elena)-[:Realiza {horario:'Tarde'}]->(java)CREATE (ana)-[:Realiza {horario:'Mañana'}]->(angular)CREATE (mario)-[:Realiza {horario:'Mañana'}]->(spring)
CREATE (pepe)-[:Amigo {rol:'Amigo de estudios'}]->(ana)
Una vez introducidas las instrucciones anteriores, para ejecutarlas pulsaremos el botón play que aparece en la parte superior a la derecha. Si todo ha ido bien, nos aparecerá en la página un mensaje informándonos de los elementos añadidos al grafo:
Pulsando el primer botón del menú de la izquierda podemos ver un resumen con la información creada y almacenada en la base de datos.
Si pulsamos sobre el botón que indica el número de nodos (7), veremos en la parte central de la página una imagen gráfica de nuestro grafo:
Como vemos, la relaciones entre nodos son totalmente flexibles. En el ejemplo anterior vemos como uno de los nodos «Pepe», además de relacionarse con uno de los nodos Cursotambién se relaciona con otro nodo Alumnoen base a la relación «Amigo».
Consultas en el grafo
Mediante la instrucción Match de Cypher podemos realizar consultas en el grafo, consultas que permiten establecer condiciones tanto sobre nodos como sobre las relaciones, lo que nos ofrece una gran potencia a la hora de buscar datos en la estructura.
A continuación, vamos a ver algunos ejemplos de utilización de la instrucción match para realizar búsquedas en nuestro grafo de alumnos y cursos.
Por ejemplo, para recuperar todos los nodos del árbol con sus relaciones utilizamos el comando:
>match(n) return n
La letra n representa simplemente el alias del nodo. Dado que no hemos establecido ninguna condición, la instrucción return nnos devolverá el grafo completo.
En este otro ejemplo, recuperamos solamente los nodos de tipo alumno:
>match(n:Alumno) return n
El aspecto gráfico de la búsqueda que nos mostrará la página de Neo4j será similar a esto:
Si lo que queremos es localizar los nodos en los que una determinada propiedad adquiere cierto valor:
>match(n {nombre:’Ana’}) return n
La anterior instrucción devuelve los nodos cuyo nombre sea «Ana».
Si el operador a aplicar es distinto a la igualdad, se puede utilizar la clausula where. Por ejemplo, la siguiente instrucción nos devuelve los cursos cuyo precio es inferior a 100:
> match(n:Curso) where n.precio<100 return n
Como hemos indicado, se pueden realizar búsquedas estableciendo como condición una relación. Por ejemplo, si queremos saber que cursos está realizando la alumna de nombre «Elena» sería:
>MATCH (:Alumno {nombre: ‘Elena’})-[:Realiza]->(c:Curso) RETURN c
Inserción de nuevos nodos a un grado
Anteriormente comentamos que los nodos y sus relaciones se deben crear conjuntamente durante el proceso de creación del grafo. ¿Pero qué pasa si posteriormente queremos añadir nuevos nodos al grafo?
El proceso es muy sencillo, simplemente crearemos los nuevos nodos que queramos incluir y después los incorporaremos al grafo mediante la instrucción Merge. A través de esta instrucción relacionamos el nuevo nodo con alguno de los ya existentes en el grafo.
Por ejemplo, la siguiente instrucción relaciona un nuevo nodo Alumno cuyo nombre es Beatriz con uno de los nodos cursos existentes, concretamente con el curso de Spring:
>match(a:Alumno{nombre:»Beatriz»}),(c:Curso{curso:»Spring»}) merge (a)-[:Realiza]->(c)
Conclusión
Las bases de datos orientadas a grafos nos permiten almacenar información de forma flexible y establecer relaciones entre las entidades que almacenan dicha información, ofreciendo un alto rendimiento en operaciones de búsqueda.
La base de datos orientada a grafos más utilizada es Neo4j, que está basada en Java. Neo4j proporciona un lenguaje llamado Cypher que ofrece una gran potencia y sencillez a la hora de realizar operaciones sobre el grafo. En este artículo hemos visto algunos ejemplos de uso de Cypher, como la instrucción Create para la creación de nodos y relaciones y Match para la realización de búsquedas, pero existen otras muchas sentencias y clausulas para operar con Cypher.
No dejes de visitar nuestra área de formacion en bases de datos