Cypher lenguaje de Neo4j - cómo crear datos

viernes, 11 de abril de 2014

En anteriores post ya hemos visto una introducción a Neo4j y en otro la instalación y un primer vistazo a Neo4j Browser. En esta ocasión vamos a ver una introducción a Cypher que es un lenguaje para queries propio que tiene Neo4j y después empezaremos a ver la clausula Create y para que se utiliza.

Introducción

Cypher es un lenguaje propio de Neo4j para realizar consultas. Es la forma declarativa de realizar consultas, porque luego esta la forma nativa que es utilizando la API de java de Neo4j.

Cypher es a Neo4j lo que T-SQL a Sql Server.

Es un lenguaje bastante intuitivo y fácil de entender. A mi forma de ver, queries que resultan largas en sql, con Cypher quedan más simples y cortas.

Para representar las relaciones se utilizan flechas y para representar nodos se utilizan paréntesis, consiguiendo de esta forma, que las queries en Cypher sean muy gráficas. Tiene bastante similitudes con queries de sql como pueden ser clausulas Where, Order by. etc..


En la imagen de arriba se ven dos nodos y la relación que los une, debajo se ve su representación genérica en Cypher, a esto me refería con que es muy visual.

En Neo4j se pueden etiquetar los nodos y las relaciones, viene a ser como definir tipos de relaciones y tipos de nodos, es de gran utilidad su uso en las queries para crear consultas más específicas.

Recordad que en Neo4j el tiempo de respuesta de una query depende de los nodos y relaciones a recorrer, no del tamaño total de la base de datos, por lo tanto cuanto más específica es una query menos hay que recorrer y tendremos un mejor tiempo de respuesta.

Crear nodos

La clausula Create se utiliza para crear nodos.

Crear un nodo simple

CREATE (n)

Crea un nodo sin datos y lo almacena en la variable n. En una query posterior se puede utilizar esa variable, también podemos devolverla como resultado
CREATE (n) RETURN n

Crear un nodo con un Label

Como hemos comentado antes, los nodos se pueden clasificar en etiquetas (Labels), es una forma de clasificar los nodos.
CREATE (n:Product)

De esta forma creamos un nodo sin datos y le asignamos la etiqueta Product, si no existe la etiqueta la crea.

También podemos asignar más de una etiqueta
CREATE (n:Product:Book)

Crear un nodo con datos y con una etiqueta

CREATE (p:Product {name:'Ipad Air',price:450}) RETURN p

Los datos que asignamos al nodo son en formato Json

Crear relaciones

La clausula Create también se utiliza para crear relaciones. Para crear relaciones podemos crear nodos y justo después utilizar las variables de los nodos para crear las relaciones. También podemos realizar una búsqueda de los nodos, almacenarlo en variables para después crear la relación. Como el objetivo de este post es la clausula create voy a optar por crear los ejemplos con la primera opción.

Crear relación simple

Creamos los nodos y después usamos las variables para relacionarlos.
CREATE (ipadAir:Product {name:'Ipad Air',price:450})
CREATE (user1:User {name:'user 1'})
CREATE (user2:User {name:'user 2'})

CREATE
  (user1)-[:BUY]->(ipadAir),
  (user2)-[:BUY]->(ipadAir)

RETURN ipadAir,user1,user2

Es una relación con la etiqueta BUY, es decir, de tipo BUY y tiene una dirección.

Las relaciones también pueden tener propiedades
CREATE (ipadAir:Product {name:'Ipad Air',price:450})
CREATE (user1:User {name:'user 1'})
CREATE (user2:User {name:'user 2'})

CREATE
  (user1)-[:BUY{ date:'2014/04/1'}]->(ipadAir),
  (user2)-[:BUY{ date: '2014/03/1'}]->(ipadAir)

RETURN ipadAir,user1,user2


Y las relaciones también pueden almacenarse en variables y devolverse con Return
CREATE (ipadAir:Product {name:'Ipad Air',price:450})
CREATE (user1:User {name:'user 1'})
CREATE (user2:User {name:'user 2'})

CREATE
  (user1)-[r1:BUY{ date:'2014/04/1'}]->(ipadAir),
  (user2)-[r2:BUY{ date:'2014/03/1'}]->(ipadAir)
RETURN ipadAir,user1,user2,r1,r2

Haciendo esta última query en Neo4j
neo4j create query 
estos son los resultados que nos da en forma de grafo

neo4j create query - graph result

Nota: he modificado para que en los nodos muestre la propiedad name en lugar del id del nodo que muestra por defecto.

Y estos en forma tabular

neo4j create query - tabular result


En este post solo he pretendido hacer una pequeña introducción consultas de creación en Cypher, para una mayor profundidad os dejo en enlace del manual de Cypher.

Libros Relacionados

Graph Databases
Neo4j in Action
A Programmatic Introduction to Neo4j

1 comentario: