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 con múltiples lenguajes como Java, PHP, Ruby, .Net, Python, Node, Scala, etc.
En el siguiente post habíamos hablado acerca de algunos tipos de base de orientados a grafos https://usuarioperu.com/2018/02/05/tipos-de-bases-de-datos-nosql/
Aunque hay varios tipos de grafos, Neo4j sigue el modelo property graph o grafo de propiedades en los que tenemos los datos en formato clave/valor, almacenando datos en los nodos y relaciones direccionales.
Las bases de datos NoSQL orientadas a grafos utilizan la topología de un grafo con nodos como vértices y relaciones como aristas y propiedades, utilizada para almacenar y representar datos conectados sin necesidad de utilizar un índice (que es el método tradicional de simular una relación en una base de datos relacional), de esta forma, los vecinos de un nodo son accesibles directamente mediante una referencia directa, sin pasar por estructuras intermedias. Nuestros datos pueden seguir distintos tipos de grafo, tener distinto tipo de relaciones, distinta multiplicidad de relaciones entre nodos (unirelacional o multirelacional) y distinta aridad de relaciones (grafo o hipergrafo).
Una base de datos orientada a grafos (BDG) es una base de datos que tiene como propósito almacenar estructuras de datos que tienen topología de grafo, es decir, que la información que se almacena se puede representar por medio de nodos y aristas entre ellos.
Por tanto, una BDG debe cumplir los siguientes criterios:
- El almacenamiento está optimizado para representar datos como un grafo, proporcionando los nodos y las aristas que lo forman.
- El almacenamiento está optimizado para realizar los traversals a través del grafo, sin uso de índices que “representen” las aristas. Por ello, una BDG está optimizada para realizar consultas en los datos en las que intervengan relaciones de proximidad (conexiones) entre datos, y no para la realización de consultas globales.
- El modelo de datos es flexible, lo que en algunas ocasiones nos permite no declarar tipos de nodos o de aristas (el tipo de nodo o arista sería equivalente a las distintas tablas que se definen en un modelo relacional).
- Integra funciones para aplicar los algoritmos clásicos de la Teoría de Grafos.
Los casos de usos recomendados para utilizar una BDG son:
- Búsquedas en base a grafos
- Sistemas de recomendación
- Redes sociales
- Gestión de identidades y accesos
- Detección de fraude
- Gestión de datos maestros
Existen formas de utilizar Neo4j:
- Con Cypher como lenguaje declarativo de consulta.
- API REST con algo más de funcionalidad que Cypher (aunque esta tendencia va disminuyendo en las últimas versiones).
- En casos especiales podemos utilizar plugins vía API
Veamos unos ejemplos usando Cypher en https://console.neo4j.org/
Tomamos como referencia los siguientes ejemplos:
Como Crear un nodo
CREATE (n)
Creación múltiples nodos
CREATE (n), (m)
Creación un nodo con un label
CREATE (n:Person)
Como crear un nodo con múltiples labels
CREATE (n:Person:Swedish)
Creación de un nodo y labels y propiedades
CREATE (n:Person {name: 'Andy', title: 'Developer'})
Retorno de la creación de un nodo
CREATE (a {name: 'Andy'})
RETURN a.name
Crear una relación entre dos nodos
MATCH
(a:Person),
(b:Person)
WHERE a.name = 'A' AND b.name = 'B'
CREATE (a)-[r:RELTYPE]->(b)
RETURN type(r)
Crear una relación y establecer propiedades
MATCH
(a:Person),
(b:Person)
WHERE a.name = 'A' AND b.name = 'B'
CREATE (a)-[r:RELTYPE {name: a.name + '<->' + b.name}]->(b)
RETURN type(r), r.name
Crea ruta completa
CREATE p = (andy {name:'Andy'})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael {name: 'Michael'})
RETURN p
Fuente: