NoSQL Neo4j - PlataformasWeb-P-AA2021/consulta1bim-erickgjs99 GitHub Wiki

Neo4j

Neo4j es una base de datos NoSQL orientada a grafos, básicamente la información se guarda utilizando estructuras en grafos las cuales están formadas por nodos y aristas. En Neo4j existen dos arquitecturas:

High Available Cluster: Es un tipo de arquitectura trata de garantizar al máximo la accesibilidad a los datos, aunque varios nodos caigan.

Casual Cluster: Su principal objetivo es dotar de una mayor escalabilidad a la base de datos y una mayor eficiencia de las operaciones de lectura mediante la deslocalización de los nodos, que pueden estar distribuidos en diferentes espacios geográficos.

High Available Cluster

Esta arquitectura está compuesta por una instancia principal (máster) y cero o más instancias secundarias (slave). Todas estas tienen una copia completa de toda la base de datos creada con Neo4j. Todas las instancias se comunican constantemente con el resto para coordinarse y conocer su estado. Las lecturas se pueden hacer sobre cualquier instancia, lo cual garantiza la accesibilidad. Si en caso suceda la instancia principal deje de estar operativa el resto de las instancias votan para determinar cuál va a ser, de entre ellas, la nueva instancia principal.

Casual Cluster

En esta arquitectura existen dos tipos de componentes:

  • Core Servers. - Su objetivo es salvaguardar los datos, siguiendo el protocolo Raft, en la cual la escritura de datos recibida por parte de una aplicación cliente se propaga desde un Core Server al resto, y se considera exitosa si, al menos, la mitad más uno de los Core Servers la ha efectuado con éxito.

  • Read replicas. - El cometido de estas réplicas es el de escalar la carga de trabajo de las operaciones de lectura. Contienen réplicas de los datos almacenados en los Core Servers, y pueden recibir peticiones de lectura por parte de los clientes.

Casual Consistency

la arquitectura garantiza que un cliente que haya efectuado determinadas operaciones de escritura, al realizar una operación de lectura este mismo cliente vea siempre los datos que el mismo ha escrito, las cuales podrá “presentar” como parámetro en subsecuentes transacciones.

Modelo de datos

  1. Nodos, que representan entidades con un concepto de identidad único.
  2. Relaciones, que representan conexiones o interacciones entre los diferentes nodos.

Lenguaje de consulta y manipulación de datos

Cypher es el lenguaje desarrollado por Neo4j para la creación de bases de datos, así como para realizar operaciones de inserción, modificado, borrado y consulta de los datos.

  • Es un lenguaje declarativo, inspirado en SQL.
  • Orientado a la descripción de patrones en grafos.

Crear un nodo

La operación CREATE permite crear nuevos nodos.

CREATE(LaroNodo:persona {nombre: ‘Laro’, anio_nac: 1988})

Donde:

  • CREATE. - Operación para crear nodos
  • LaroNodo. - Variable temporal en la que se almacena el nodo. Puede servir para seguir trabajando con él en la creación de relaciones (ver siguiente trasparencia).
  • Persona. - Etiqueta
  • ‘Laro’. – Propiedades

Eliminar un nodo

El operador DELETE puede usarse para eliminar nodos. La siguiente instrucción elimina los nodos con etiqueta persona con nombre Laro

MATCH (p:persona) WHERE p.nombre=‘Laro’ DELETE p

¡PELIGRO! Para eliminar un nodo, es necesario eliminar antes sus relaciones. Éstas pueden eliminarse también con el operador DELETE.

Crear relaciones con CREATE y MATCH

La operación CREATE permite también crear relaciones entre nodos.

Consultas con el operador MATCH

El operador MATCH permite hacer consultas con condiciones sobre los datos de los nodos y sus relaciones.

MATCH (p:persona) RETURN p

Donde:

  • MATCH. - Operación MATCH
  • p. - Variable en la que se almacenan los datos que se van a retornar
  • Persona. - Etiqueta
  • RETURN. - Operación de retorno de resultados

En esta consulta devolvería todos los nodos etiquetados como “persona”.

MATCH (p) RETURN p

La consulta devolverá los datos de todos los nodos de la base de datos ya que no indica que los nodos pertenezcan a una etiqueta.

Condicionales en el WHERE

MATCH (p:persona) WHERE p.nombre=‘Laro’ RETURN p.nombre, p.anio_nac

la operación MATCH en Cypher tiene una cláusula WHERE para expresar condiciones, en este ejemplo de consulta se nos devolverá aquellas personas con nombre “Laro”.

  • OR Consultar personas que se llamen Laro o hayan nacido posteriormente al año 1992

MATCH (p:persona) WHERE p.nombre=‘Laro’ OR p.anio_nac>1992 RETURN p

  • AND Consultar personas que se llamen Laro y además hayan nacido posteriormente al año 1992

MATCH (p:persona) WHERE p.nombre=‘Laro’ AND p.anio_nac>1992 RETURN p

  • XOR Consultar personas que se llamen Laro o hayan nacido posteriormente al año 1992, sin retornar aquellas que cumplan simultáneamente ambas condiciones MATCH (p:persona) WHERE p.nombre=‘Laro’ XOR p.anio_nac>1992 RETURN p

Operadores

  • ORDER BY

Ordena de forma ascendente (ASC) o descendente (DESC) los resultados

MATCH (p:persona) RETURN p ORDER BY p.nombre ASC, p.anio_nac DESC

  • LIMIT

Limita el número de nodos retornados

MATCH (p:persona) RETURN p LIMIT 1

  • DISTINCT

Si un resultado se repite, sólo lo devuelve una vez

MATCH (p:persona) RETURN DISTINCT p

  • COUNT

Si un resultado cumple con la condición, que lo cuente.

MATCH (p:persona) WHERE p.anio_nac>1980 RETURN count(*)

Ventajas

  • Modelo muy natural para representar datos conectados. Directamente leíble y fácil de interrogar
  • Implementa consultas referidas a la estructura en grafo (recorridos, adyacencia, etc.), gracias al uso de algoritmos basados en grafos (A*, Dijsktra, etc.).
  • No O/R mismatch – mapeo simple del grafo a lenguajes orientados a objetos como Ruby, Java, C#, phyton.
  • Es altamente disponible (HA) y tolerante a la partición (AP), lo que puede hacer que devuelva datos fuera de sync

Desventajas

  • El modelo de datos no está estandarizado à dificultad de cambio de gestor.
  • Cypher no es un lenguaje estandarizado.
  • Falta de herramientas para ETL, modelado, …
  • Replicación de grafos completos, no de subgrafos (sharding).

Bibliografía

Zorrilla, M & García, D. (2017). Gestores NoSQL – Neo4j. Obtenido de https://github.com/PlataformasWebPAA2021/consulta1bimerickgjs99/blob/main/REA/NoSQL_Tema2_Neo4j.pdf