Estas BDs están creadas para diseñar y analizar datos en forma de grafos. En grafos los datos se presentan como nodos, muy comparable a un esquema de redes neuronales o de computación. La relación entre los nodos va a representarse como las aristas. A los nodos se los denomina vértices, y a las aristas se las denomina bordes.
Características
- Basadas en grafos: especializadas en relaciones basadas en análisis de datos, para IA.
- Las relaciones y propiedades que se generan en ellos dotan de una relación más basta que en una relación transaccional, gracias a su esquema no tan rígido.
- Las consultas y el análisis están optimizados para realizar consultas complejas que siguen diferentes caminos.
- La flexibilidad y escalabilidad son puntos importantes, nos permiten trabajar con gran cantidad de información.
- Descubrimiento de patrones y recomendaciones.
- En la detección de fraudes se utiliza este modelo de datos.
- Integración de lenguajes específicos, dependiendo del sistema gestor de bases que se use.
Algunas de las bases de datos para grafos son Neo4j, OrientDB, ArangoDB…
Introducción a Neo4j
Neo4j es como uno de los mas representativos de las bases de datos orientadas a grafos, su página web oficial es https://neo4j.com/. Tiene un esquema altamente flexible y escalable. Se puede almacenar gran cantidad de información.
Principales características
- Trabaja con nodos y aristas, lo que vendría a ser tablas y relaciones en un modelo transaccional.
- Tiene un alto rendimiento y escalabilidad.
- Esquema flexible: de un nodo a otro el esquema puede variar dependiendo de las necesidades.
- Su indexación y la búsqueda es bastante eficiente.
Generalmente se utiliza para aplicaciones y casos de uso como el análisis de grandes cantidades de información, aplicaciones de redes sociales, recomendaciones personalizadas, como cuando buscamos algo en Youtube y nos salen recomendaciones, o si estuvimos en un comercio electrónico y nos aparecen también recomendaciones, detección de fraudes, análisis financieros, prospección de futuros, gestión de identidad y acceso, para wikis (bases de datos de conocimientos).
Neo4j tiene diferentes productos y diferentes soluciones. Vamos a utilizar una herramienta denominada Aura, que es la base de datos orientada a grafos. El lenguaje que utiliza se denomina Cypher. Existe una versión community edition y una versión empresarial (de pago).
Para el ejercicio que vamos a realizar con Neo4j nos tenemos que crear una cuenta. Una vez estamos logueados veremos la consola, y lo que tenemos que hacer es crear una nueva instancia de forma gratuita.
Las credenciales de nuestra instancia nos las dará en texto plano, y tenemos que guardar este archivo. Si perdemos este archivo con la información de la instancia y el password, no lo vamos a poder recuperar. Este archivo que debemos descargarnos nos facilita los datos de conexión a la base de datos. Le damos a continuar y comienza a crear la instancia. Una vez creada la instancia le damos al botón OPEN para abrirla, y aquí es donde nos pedirá los datos que hemos descargado del archivo, como son el password, incluimos el password y entramos en la interfaz de Neo4j.
Primeros pasos
Vamos a comenzar a trabajar en la plataforma de Neo4j. Para ello realizaremos un ejm. Si queremos escribir sintaxis en nuestro editor de código, la extensión de Neo4j es .cyp o .cypher. Vamos a crear un caso hipotético de sistema para recomendar películas a personas, e ir viendo cuales son las películas que ya han visto los usuarios.
Ejm
-- Crear un nodo llamado User
CREATE (:User {name: 'Francisco', age: 32})
-- Crear un nodo llamado Movie
CREATE (:Movie {title: 'Titulo' genre: 'Terror'})
-- Crear la relación entre el nodo User y el nodo Movie
-- Relaciona Francisco con Titulo
MATCH (u:User {name: 'Francisco'}),(m:Movie {title: 'Titulo'})
CREATE (u)-[:HAS_SEEN]->(m)
De esta manera se puede crear un conjunto de nodos y su relación entre sí.
CRUD
Vamos a incluir más información el ejm que estamos trabajando.
Ejm
-- Creamos 2 usuarios más
CREATE (:User {name: 'Beatriz', age: 22})
CREATE (:User {name: 'Bob', age: 32})
-- Creamos 2 películas más
CREATE (:Movie {title: 'Titulo 2', genre: 'Drama'})
CREATE (:Movie {title: 'Titulo 3', genre: 'Comedia'})
-- Asignar dos películas a Beatriz
MATCH (u:User {name: 'Beatriz'}),(m:Movie {title: 'Titulo 2'})
CREATE (u)-[:HAS_SEEN]->(m)
MATCH (u:User {name: 'Beatriz'}),(m:Movie {title: 'Titulo 3'})
CREATE (u)-[:HAS_SEEN]->(m)
-- Asignar dos películas a Bob
MATCH (u:User {name: 'Bob'}),(m:Movie {title: 'Titulo 2'})
CREATE (u)-[:HAS_SEEN]->(m)
MATCH (u:User {name: 'Bob'}),(m:Movie {title: 'Titulo 3'})
CREATE (u)-[:HAS_SEEN]->(m)
-- El CREATE es como si fuera la creación
-- El MATCH es como si fuera el SELECT
CREATE (:User {name: 'Eva', age: 10})
MATCH (u:User {name: 'Eva'})
RETURN u
-- En u guardas el usuario con el nombre Eva y le cambias la edad
MATCH (u:User {name: 'Eva'})
SET u.age = 15
-- En u guardamos el nombre Eva para posteriormente borrarlo
MATCH (u:User {name: 'Eva'{)
DELETE u
-- Creamos la película Titulo 4, seleccionamos dicha película y la imprimimos en pantalla
CREATE (:Movie {title: 'Titulo 4', genre: 'Horror'})
MATCH (m:Movie {title: 'Titulo 4})
RETURN m
Este es un ejm sencillo de como funcionan las bases orientadas a grafos.
