Primeros pasos con Neo4j
0. Índice de contenidos.
- 1. Introducción.
- 2. Entorno.
- 3. Instalación.
- 4. Lenguaje Cypher.
- 4.1 Crear el grafo.
- 4.2 Consultas sobre el grafo.
- 5. Conclusiones.
1. Introducción.
Neo4j es una base de datos orientada a grafos escrita en Java, es decir la información se almacena de forma relacionada formando un grafo dirigido entre los nodos y las relaciones entre ellos. Se integra perfectamente con múltiples lenguajes como Java, PHP, Ruby, .Net, Python, Node, Scala, etc. La base de datos está embebida en un servidor Jetty. Está especialmente indicada para modelar redes sociales y sistemas de recomendación.
Se distribuye en dos versiones: la community edition (open source) y la enterprise edition. Para hacer pruebas de concepto nos basta con la community edition pero si quieres sacarle todo el partido a Neo4j la opción enterprise es la más recomendable ya que permite ponerla en cluster, monitorización, backups en caliente y un sistema de cache de alto rendimiento, además de soporte de sus creadores.
Otra de las ventajas que tiene Neo4j es que se pueden efectuar las consultas directamente a través de un API Rest lo que hace especialmente interesante su integración con aplicaciones web.
En este tutorial vamos a ver unos primeros pasos con Neo4j, cómo instalarla en una máquina Ubuntu, crear un grafo y realizar consultas sobre el mismo.
2. Entorno.
El tutorial se ha realizado con el siguiente entorno:
- Ubuntu 12.04 64 bits
- Oracle Java SDK 1.7.0_51-b13
- Neo4j 2.1.1 – community edition
3. Instalación
Antes de instalar Neo4j comprueba que tienes como mínimo la versión 1.7 del SDK de Java. Para instalar Neo4j voy a optar por hacerlo utilizando el repositorio de paquetes de Debian. Los pasos son los siguientes:
Nos cambiamos a usuario root
sudo -s
Importamos la clave pública de neo4j y añadimos el repositorio al sources.list
wget -O - http://debian.neo4j.org/neotechnology.gpg.key apt-key add echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list
Actualizamos los repositorios e instalamos el paquete neo4j, versión community edition
apt-get update apt-get install neo4j
Si todo ha ido bien nos saldrá el mensaje por consola:
Starting Neo4j Server...WARNING: not changing user process [10310]... waiting for server to be ready........................ OK. http://localhost:7474/ is ready.
En la url http://localhost:7474 se levanta un cliente de Neo4j para trabajar y visualizar la base de datos de Neo4j. También tiene una ayuda muy útil para ir conociendo el interfaz del cliente web así como una pequeña guía que explica los conceptos de grafo, nodo, etiqueta, relación y unos primeros pasos con el lenguaje cypher.
4. Lenguaje Cypher.
Cypher es un lenguaje declarativo para trabajar con grafos. Permite crear la estructura de un grafo, nodos y relaciones así como realizar consultar filtrando con argumentos, ordenar, etc. Para aprender a utilizar este lenguaje voy a utilizar el ejemplo del grafo de películas y actores que viene con la instalación de Neo4j llamada ‘The Movie Graph’.
4.1 Crear el grafo.
Con CREATE estamos creando un nodo del grafo (se sabe porque va entre paréntesis) con etiqueta ‘Movie’ que se guarda en la variable ‘TheMatrix’ (utilizada para posteriormente referirnos al nodo) con las propiedades ‘title’, ‘released’ y ‘tagline’ con sus respectivos valores en formato JSON.
Un trozo del grafo para la película Matrix con sus actores principales, directores y productor.
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'}) CREATE (Keanu:Person {name:'Keanu Reeves', born:1964}) CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967}) CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961}) CREATE (Hugo:Person {name:'Hugo Weaving', born:1960}) CREATE (AndyW:Person {name:'Andy Wachowski', born:1967}) CREATE (LanaW:Person {name:'Lana Wachowski', born:1965}) CREATE (JoelS:Person {name:'Joel Silver', born:1952}) CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix), (Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix), (Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix), (Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix), (AndyW)-[:DIRECTED]->(TheMatrix), (LanaW)-[:DIRECTED]->(TheMatrix), (JoelS)-[:PRODUCED]->(TheMatrix) ...
A continuación se crean unos cuantos nodos más etiquetados con ‘Person’ y las propiedades ‘name’ y ‘born’ de forma similar al anterior. Estos nodos de momento no forman un grafo, al menos un grafo que tenga cierto sentido para nosotros, por ello es necesario crear las relaciones.
Las relaciones se crean de forma muy similar a los nodos, mediante CREATE indicamos a través de las variables que identifican los nodos las relaciones con otros nodos. La relación puede tener nombre y propiedades. Si intentamos interpretar la primera, el lenguaje declarativo de Cypher nos indica que una persona identificada como ‘Keanu’ actuó con el rol de ‘Neo’ en ‘TheMatrix’.
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'}) CREATE (Keanu:Person {name:'Keanu Reeves', born:1964}) CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix), ...
Como ves el lenguaje es bastante sencillo de entender. Para el resto de actores las relaciones son similares, cambiando su rol en la película pero el tipo de relación es el mismo ‘ACTED_IN’. Esto es importante para luego las consultas dentro del grafo. Otras relaciones del grafo son para los dos directores y el productor.
4.2 Consultas sobre el grafo.
Una vez creado el grafo vamos a realizar algunas consultas sobre él.
Si queremos buscar algo en el grafo debemos buscar con MATCH. Para consultar todo el grafo.
MATCH (n) RETURN n
Desde el cliente de Neo4j podemos abrir los distintos nodos y ver sus relaciones. También podemos ver las propiedades de cada nodo con sus atributos.
Si queremos buscar un nodo en concreto dentro del grafo. Si existe un nodo con el atributo ‘name’ igual a ‘Keanu Reeves’ nos lo devolverá.
MATCH (actor {name: "Keanu Reeves"}) RETURN actor
Más búsquedas, por ejemplo consultar todas las películas en las que ha actuado un actor:
MATCH (n {name: "Keanu Reeves"})-[:ACTS_IN]->(d) RETURN n, COUNT(d)
Todos los actores de una película:
MATCH (m:Movie {title:"The Matrix"})
Listado de las películas filmadas en 2008.
MATCH (nineties:Movie) WHERE nineties.released = 2008 RETURN nineties.title
Listado de todas las películas y sus actores
MATCH (m:Movie)(movie) RETURN movie.title, collect(actor.name), count(*) as count ORDER BY count desc;
Como se puede ver la creación de un grafo en Neo4j es muy sencilla así como realizar las consutas que necesitemos para extraer la información que necesitemos.
5. Conclusiones.
En un primer vistazo hemos podido ver cómo funciona Neo4j, la creación de un grafo y sus consultas a través del lenguaje Cypher. Este lenguaje está basado en SQL por lo que cuando empiezas con él su sintaxis te resulta muy familiar. Las consultas ya dependen de las necesidades de tu negocio.
Os dejo alguna referencia para profundizar en Neo4j:
Guía de referencia: http://docs.neo4j.org/chunked/milestone/preface.html
Chuleta de neo4j: http://docs.neo4j.org/refcard/2.1/
Recursos de aprendizaje http://www.neo4j.org/learn
Charla de Michael Huger – Neo4j for Java Developers: https://www.youtube.com/watch?v=FCp68iGo0pY
Espero que te haya sido de ayuda.
Un saludo.
Juan
Sencillamente impresionante, agradecerte tutoriales como estos y invitarte a que sigas publicando sobre NoSQL.
Hola! gracias por al introducción, queda muy claro apra zotes como yo 😀
Una duda: en la ultima query
MATCH (m:Movie)(movie)
RETURN movie.title, collect(actor.name),
count(*) as count
ORDER BY count desc;
Por qué necesitas añadir (movie) al final del MATCH? no puedes usar la ‘m’ para referirte a la pelicula en cuestion como en la query de «nineties»?
Por cierto, una imagen sale mal renderizada porque la pilla el formatter de codigo, aunque la url es buena… por si queréis ponerla ^__^
buen aporte amigo me gustaria que publicaras mas sobre este tema yo me encuentro en investigacion de neo4j y ando checando el The Neo4j Manual v2.3.3 y como decimos en mexico un poco de ayuda extra nunca cae mal.
saludos y siguan asi