Analisis de los modelos de bases de datos basadas en grafos centrándose en Neo4J así como de su funcionamiento interno y arquitectura y el lenguaje Cypher.
1. NEO4J
Javier de la Rosa FernándezUniversidad Europea de Madrid | Sistemas distribuidos
2. INTRODUCCIÓN – MODELO BASADO EN GRAFOS
Un modelo basado en grafos se compone de:
Nodos: Pueden contener cualquier número de
atributos que están formados por conjuntos de
pares Clave-Valor.
Etiquetas: Roles y metadatos.
Relaciones: Proporcionan conexiones dirigidas entre
dos nodos y están formada por:
Nodo origen
Nodo destino
Tipo
Las relaciones pueden incluir propiedades: pesos, costes, intervalos
de tiempo, etc.
4. INTRODUCCIÓN – MODELO BASADO EN GRAFOS
Una regla de oro en los modelos de grafos es que:
“No existen conexiones rotas”
No se puede eliminar un nodo sin eliminar también toda sus
conexiones, lo que significa que es imposible tener que una
conexión apunte a algo inexistente.
5. NEO4J – UN POCO DE HISTORIA
Neo4j nace de la mano de NeoTechnology como una base de
datos orientada a grafos de código abierto implementada en
Java y Scala.
El desarrollo se inició en 2003 y se puso a disposición del
público en el año 2007. Además su código está disponible en
gitHub permitiendo a usuarios y entidades colaborar con
ellos.
Neo4j es usado por cientos de miles de compañía en una
gran variedad de industrias: ebay, wallmart, telenor, …
6. NEO4J – MODELO ORIENTADO A GRAFOS
Neo4j implementa un modelo orientado a grafos de manera
eficiente a nivel de almacenamiento. Neo4j ofrece gran
cantidad de características de las bases de datos incluyendo
el cumplimiento de transacción ACID.
7. NEO4J – ALTA DISPONIBILIDAD (NEO4J HA)
Cuando se ejecuta en modo de Neo4j HA siempre hay
un solo maestro y cero o más esclavos. En comparación
con otras configuraciones de replicación maestro-
esclavo Neo4j HA puede manejar las solicitudes de
escritura en todas las máquinas para que no haya
necesidad de redirigirlas al maestro.
Un esclavo se encargará de las escrituras sincronizándose con el maestro para mantener la
consistencia. Las escrituras en el maestro se puede configurar para ser optimistas replicándose a
0 o más esclavos.
Todas las actualizaciones se propagan desde el maestro a otros esclavos finalmente por lo que
una escritura de un esclavo puede no estar visible en todos los otros esclavos de manera
inmediata.
EVENTUALMENTE CONSISTENTE => NO CUMPLE CON LA ‘C’ DE ACID
8. NEO4J – ALTA DISPONIBILIDAD (NEO4J HA)
Al iniciarse una instancia de base de datos Neo4j HA, intentará conectarse a un
clúster existente especificado por la configuración. Si existe el clúster, la
instancia se unirá a él como un esclavo. De lo contrario, el clúster se creará y la
instancia se convertirá en su maestro.
Para garantizar la coherencia, un esclavo tiene que estar al corriente
(sincronizado) con el maestro antes de realizar una operación de escritura. Esto
está integrado en el protocolo de comunicación entre el esclavo y el maestro,
por lo que las actualizaciones implican a un esclavo comunicarse con su maestro
automáticamente.
En caso de éxito en la escritura, está será replicada en un número configurable
de esclavos. Es optimista, aunque la replica falle, la transacción se acabará
realizando.
9. NEO4J – ALTA DISPONIBILIDAD (NEO4J HA)
Si se produce un fallo al intentar acceder a una instancia (como
por ejemplo un fallo en el hardware), las otras instancias lo
detectan y lo marcan como temporalmente fallida.
Cuando esta instancia está disponible de nuevo, el clúster la
captura de forma automática.
¿Y si se cae una instancia?
10. NEO4J – ALTA DISPONIBILIDAD (NEO4J HA)
Si el maestro se cae otro miembro (el más adecuado) será elegido
y cambiarán su papel de esclavo a maestro después de que se
haya alcanzado el quórum en el clúster.Tras el nuevo maestro
tomar este rol, notificará al resto de esclavos de su existencia
como maestro.
Durante este tiempo (unos segundos), las escrituras se bloquean.
Cuando el viejo maestro sea relanzado, este cargará una copia del
nuevo maestro.
¿Y si es el maestro quien se cae?
11. NEO4J – CARACTERÍSTICAS PRINCIPALES
Las escrituras se pueden realizar en cualquier instancia del clúster.
Neo4j es tolerante a fallos para cualquier número de máquinas y para la caída de cualquiera de
las máquinas.
Los esclavos se sincronizarán automáticamente con el maestro en las operaciones de
escrituras.
Si el master cae, un nuevo master será elegido automáticamente.
El clúster automáticamente maneja la incorporación de nuevas instancias.
Las transacciones son atómicas, consistentes (o eventualmente) y duraderas.
El factor de replicación es configurable.
Si el maestro se cae cualquier nueva transacción de escritura se bloqueará hasta que un nuevo
maestro sea elegido.
12. NEO4J – CARACTERÍSTICAS PRINCIPALES
Neo4J puede almacenar cualquier tipo de información
usando los siguientes conceptos:
Nodos: Almacena los registros del grafo.
Relaciones: Conecta los distintos nodos.
Propiedades: Datos con nombre.
13. CYPHER - INTRODUCCIÓN
Cypher es el lenguaje de consulta que proporciona una buena
manera de realizar queries y otras acciones en Neo4j. Aunque
Cypher está orientado para el uso en trabajos de exploración, es
lo suficientemente rápido para poder usarse en producción.
Se pueden usar aproximaciones en java para manejar aquellos
casos en los que Cypher pueda no resultar lo suficientemente
eficiente.
14. CYPHER - INSTALACIÓN
“Plug AND Play”
Únicamente consiste en descargar el fichero comprimido de
la web oficial y ejecutar /bin/neo4j start.
Tras esto se inicia el servidor y podemos ejecutar su versión
web mediante en el puerto 7474:
http://localhost:7474
15. CYPHER - IMPLEMENTACIÓN
Función CREATE
La sentencia para la creación de datos es CREATE. Con esta
sentencia podemos crear nodos y estructuras más complejas.
CREATE (:NombreNodo{
NombrePropiedad:"valorPropiedad",NombrePropiedad2:valorPropiedadNum })
CREATE (a:NodoA{ NombrePropiedad:"valorPropiedad",...})-[r:ACTED_IN { roles:
["Forrest"]}]->(b:NodoB{ NombrePropiedad:"valorPropiedad",... })
RETURN a,b
CREATE (c:NodoC { NombrePropiedad:"valorPropiedad",... })-
[:NOMBREETIQUETA]->(b)
16. CYPHER - IMPLEMENTACIÓN
CREATE (you:Person {name:"You"}) RETURN you
MATCH (you:Person {name:"You"}) CREATE (you)-[like:LIKE]-
>(neo:Database:NoSql:Graph {name:"Neo4j" }) RETURN you,like,neo
Es necesario el match, si no se pone y el nodo no existe,
neo4j creará el nodo apuntando a un nodo vacío.
Con la función Match, si no existe el nodo, no se crea ni el
nodo ni la relación.
18. CYPHER - IMPLEMENTACIÓN
Función MATCH
La función MATCH se utiliza para realizar búsquedas que
coincidan con un patrón debe de ser introducido.
MATCH (variable:NombreNodo) RETURN variable
MATCH (variable:NombreNodo { nombreCampo:"ValorCampo" }) RETURN
variable
MATCH (a:NodoA{nombreCampo:"ValorCampo" })-[r:ETIQUETA]-
>(b:NodoB) RETURN a.nombreCampo2, r.roles
19. CYPHER - IMPLEMENTACIÓN
Función MATCH
Además Cypher es muy parecido a SQL y tiene palabras reservadas
propias de SQL como pueden ser:WHERE, COUNT, GROUP BY,
ORDER BY, etc.
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
WHERE movie.title =~ "T.*"
RETURN movie.title as title, collect(actor.name) as cast
ORDER BY title ASC LIMIT 10;
En Cypher no existe la palabra LIKE , sino que queda sustituida por la
expresión ‘=~’
20. CYPHER - IMPLEMENTACIÓN
Función MATCH
Cypher realiza automáticamente las agrupaciones (Group by) al
realizar una operación de agregación.
MATCH (:Order)<-[:SOLD]-(e:Employee)
RETURN e.name, count(*) as cnt
ORDER BY cnt DESC LIMIT 10
En Cypher no existe la palabra LIKE , sino que queda sustituida
por la expresión ‘=~’
21. CYPHER - IMPLEMENTACIÓN
Función DELETE
La función DELETE es similar a la función sql, y con el MATCH
podemos hacer de filtro para saber que queremos eliminar.
MATCH (n { name: 'Andres' })-[r]-() DELETE n, r
22. VENTAJASY DESVENTAJAS
Ventajas:
Lenguaje sencillo
Muy visual
Buena para redes sociales
Desventajas:
¿Problema con muchos datos?
¿Díficil de mantener por la necesidad de crear múltiples
nodos?