Estudio del estado del arte en bases de datos orientadas a grafos

Página creada Julia Ortalano
 
SEGUIR LEYENDO
Estudio del estado del arte en bases de datos orientadas a grafos
Universidad ORT Uruguay
                 Facultad de Ingenierı́a

  Estudio del estado del arte en
bases de datos orientadas a grafos
Entregado como requisito para la obtención del tı́tulo de
        Licenciatura en Ingenierı́a de Software

                 Miguel Nuñez (191877)

          Tutores: Juan Gabito, Sergio Yovine

                          2021
Estudio del estado del arte en bases de datos orientadas a grafos
Declaraciones de autorı́a

    Miguel Nuñez el autor de esta obra, declaro que el trabajo que se presenta en
esta obra es de mi propia mano. Puedo asegurar que:
     La obra fue producida en su totalidad mientras realizaba el Trabajo integrador;
     Cuando he consultado el trabajo publicado por otros, lo he atribuido con
     claridad;
     Cuando he citado obras de otros, he indicado las fuentes. Con excepción de
     estas citas, la obra es enteramente mı́a;
     En la obra, he acusado recibo de las ayudas recibidas;
     Cuando la obra se basa en trabajo realizado conjuntamente con otros, he
     explicado claramente qué fue contribuido por otros, y qué fue contribuido por
     mi;
     Ninguna parte de este trabajo ha sido publicada previamente a su entrega,
     excepto donde se han realizado las aclaraciones correspondientes.

             Miguel Nuñez

                                  26/07/2021

                                                                           2
Estudio del estado del arte en bases de datos orientadas a grafos
Agradecimientos

    A mi familia por el apoyo y la paciencia que me han brindado dı́a a dı́a para
alcanzar una de las metas propuestas.

   A mi amigo Eduardo, quien directa o indirectamente ha influido en mis decisio-
nes, ya sea con una plática o con el ejemplo de sus acciones.

  A compañeros y compañeras con quienes hemos ido caminando juntos y mutua-
mente nos hemos apoyado.

   A los profesores por compartir todos sus conocimientos, paciencia y voluntad de
explicar las veces necesario para comprender el tema, para que pueda crecer tanto
en el ámbito personal como en el profesional.

   A mis tutores y guı́a académico que me han trasmitido sus conocimientos para
seguir adelante.

                                                                         3
Estudio del estado del arte en bases de datos orientadas a grafos
Abstract

   En este trabajo de tesis se muestran las denominadas bases de datos orientada
a grafos (BDoG) y para comprender el contexto se hace una introducción a grafos,
sus propiedades y tipos de grafos para después profundizar en las BDoG.

    Otro aspecto trabajado son las comparaciones de motores de bases de datos
orientadas a grafos contra bases de datos relacionales, comparando consultas com-
plejas y el armado del modelado. En efecto el modelado y algunos tipos de consultas
se pueden volver complejos en el mundo relacional mientras que en las BDoG se da
de forma natural.

   También se brinda una guı́a para decidir cuándo utilizar una BDoG con simples
preguntas y también resumidas en un árbol de decisión.

   Además se menciona diferentes tipos de gestores de base de datos orientadas
a grafos cubriendo almacenamiento en disco, en la nube y en memoria. Para cada
una se detallan la estructura de almacenamiento, el modelado de datos, manejo de
transacciones, interfaces y lenguajes de consultas.

   Sobre los lenguajes de consultas, se comparan los tres más populares de la ac-
tualidad.

    Finalmente se menciona el aprendizaje sobre grafos done se comentan cuatro
técnicas principales.
Estudio del estado del arte en bases de datos orientadas a grafos
Palabras clave

   grafo; base de datos orientada a grafos (BDoG); base de datos relacional (RDBMS);
SQL (Structured Query Language); NoSQL; Common Table Expressions (CTE); ti-
pos de grafos; neo4j; ArangoDB; TerminusDB; Amazon Neptune; Cypher; Gremlin;
Sparql;

                                                                          5
Estudio del estado del arte en bases de datos orientadas a grafos
Índice general

1. Introducción                                                                                                                     8
   1.1. Contexto y motivación . . . . . . . . . . . . . . . . . . . . . . . . . .                                                   8
   1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  9
   1.3. Estructura del documento . . . . . . . . . . . . . . . . . . . . . . . .                                                     9

2. Introducción a grafos                                                                                                            11
   2.1. ¿Qué es un grafo? . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   11
   2.2. ¿Qué es una base de datos orientada a grafos (BDoG)? . . .                                                  .   .   .   .   12
   2.3. Comparación con otros tipos de bases de datos . . . . . . . .                                               .   .   .   .   13
   2.4. ¿Por qué existen? . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   14

3. Base de datos orientada a grafos vs base                          de      datos relacional                                        16
   3.1. Consultas recursivas . . . . . . . . . . .                   . .     . . . . . . . . . . .                       .   .   .   18
        3.1.1. Representación con RDBMS . . .                       . .     . . . . . . . . . . .                       .   .   .   19
        3.1.2. Representación con BDoG . . . .                      . .     . . . . . . . . . . .                       .   .   .   21
   3.2. Diferentes tipos de resultados . . . . .                     . .     . . . . . . . . . . .                       .   .   .   23
        3.2.1. Representación con RDBMS . . .                       . .     . . . . . . . . . . .                       .   .   .   23
        3.2.2. Representación con BDoG . . . .                      . .     . . . . . . . . . . .                       .   .   .   24
   3.3. Caminos . . . . . . . . . . . . . . . . .                    . .     . . . . . . . . . . .                       .   .   .   25
   3.4. Modelado BDoG . . . . . . . . . . . .                        . .     . . . . . . . . . . .                       .   .   .   26

4. Cuándo usar BDoG                                                                                                                 29
   4.1. Selección - búsqueda . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
   4.2. Datos relacionados o recursivos . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
   4.3. Agregación . . . . . . . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
   4.4. Coincidencia de patrones . . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31
   4.5. Centralidad, agrupación e influencia            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31
   4.6. Guı́a para decidir . . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   32
   4.7. Algunos usos de la BDoG . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   34

5. Tipos de grafos                                                                                                                   36
   5.1. Grafo no dirigido . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
   5.2. Grafo dirigido . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
   5.3. Grafo con peso o ponderado       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
   5.4. Grafo con etiquetas . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
   5.5. Grafo de propiedades . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38
   5.6. Multigrafo . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38

                                                                                                                         6
Estudio del estado del arte en bases de datos orientadas a grafos
6. Tipos de gestores de BDoG                                                                                              39
   6.1. Neo4j . . . . . . . . . . . . . . . . . . . . . . . . . . . .                     .   .   .   .   .   .   .   .   39
        6.1.1. Modelo de datos . . . . . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   39
        6.1.2. Restricciones de integridad . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   39
        6.1.3. Manejo de transacciones . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   40
        6.1.4. Almacenamiento fı́sico de la estructura de datos                           .   .   .   .   .   .   .   .   40
        6.1.5. Datos en cache . . . . . . . . . . . . . . . . . .                         .   .   .   .   .   .   .   .   43
   6.2. ArangoDB . . . . . . . . . . . . . . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   45
        6.2.1. Modelo de datos . . . . . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   45
        6.2.2. Restricciones de integridad . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   45
        6.2.3. Manejo de transacciones . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   45
        6.2.4. Almacenamiento fı́sico de la estructura de datos                           .   .   .   .   .   .   .   .   47
   6.3. TerminusDB . . . . . . . . . . . . . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   47
        6.3.1. Modelo de datos . . . . . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   48
        6.3.2. Restricciones de integridad . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   49
        6.3.3. Manejo de transacciones . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   49
        6.3.4. Almacenamiento de la estructura de datos . . .                             .   .   .   .   .   .   .   .   49
   6.4. Amazon Neptune . . . . . . . . . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   51
        6.4.1. Modelo de datos . . . . . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   52
        6.4.2. Restricciones de integridad . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   52
        6.4.3. Manejo de transacciones . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   54
        6.4.4. Almacenamiento de la estructura de datos . . .                             .   .   .   .   .   .   .   .   54
        6.4.5. Almacenamiento distribuido . . . . . . . . . . .                           .   .   .   .   .   .   .   .   55

7. Lenguajes de consultas BDoG                                                                                            56
   7.1. CYPHER vs GREMLIN vs SPARQL                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   56
   7.2. Ejemplo práctico . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   58
        7.2.1. Datos del modelo - COVID-19 .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   59
        7.2.2. Consultas . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   60

8. Aprendizaje sobre grafo                                                                                                63
   8.1. Clasificación de nodos . . . . .     . . . . . . . . . . . . . . . . . . . . .                                   63
   8.2. Predicción de enlaces . . . . . .    . . . . . . . . . . . . . . . . . . . . .                                   63
   8.3. Detección de comunidad . . . .       . . . . . . . . . . . . . . . . . . . . .                                   63
   8.4. Clasificación de grafo . . . . . .   . . . . . . . . . . . . . . . . . . . . .                                   64
   8.5. Modelos de inteligencia artificial    - aprendizaje automático explicables                                       64

9. Conclusiones                                                                                                           66

10.Glosario                                                                                                               67

11.Anexo A                                                                      73
   11.1. Datos de ejemplos - COVID-19 . . . . . . . . . . . . . . . . . . . . . 73

                                                                                                              7
Estudio del estado del arte en bases de datos orientadas a grafos
1. Introducción

    Los RDBMS han sido el paradigma que ha dominado el almacenamiento de datos
en los sistemas que se han desarrollado durante los últimos 40 años. Es un modelo
bien fundado en bases matemáticas que puede representarse fácilmente usando al-
goritmos computacionales, pero también lo hace muy rı́gido.

   Aun ası́, hemos llegado a un punto en que seguir usando bases de datos relacio-
nales para todos los casos es simplemente inviable.

   En un mundo de constantes cambios a nivel de sistemas, donde los RDBMS no
son flexibles, también por su naturaleza computacional se vio la necesidad de otras
opciones para otros tipos de escenarios complejos.

   Por lo que nace el movimiento NoSQL o también “No uses solo SQL”. Donde las
categorı́as más usadas de NoSQL son:

     Bases de datos clave valor.

     Bases de datos columnares.

     Bases de datos orientadas a documentos.

     Bases de datos orientadas a grafos (BDoG).

   En este trabajo se profundizará en las bases de datos orientadas a grafos.

1.1.     Contexto y motivación
   En la actualidad hay un gran número de BDoG con sus propios lenguajes de
consultas y estructuras de almacenamiento.

    Además, en los grafos se puede observar que se consideran las relaciones (aris-
tas) con lo cual las consultas que implican estas relaciones se pueden hacer de forma
eficiente.

   Teniendo en cuenta lo mencionado anteriormente, surgió la motivación de pro-
fundizar en algunos motores, como almacenan los datos, los tipos de grafos que
soportan, las diferencias entre los lenguajes de consultas y sus ventajas contra los
almacenamientos RDBMS.

                                                                            8
Estudio del estado del arte en bases de datos orientadas a grafos
1.2.      Objetivos
  1. Introducción a grafos.

  2. Comparativa entre BDoG vs RDBMS.

  3. Cuando utilizar BDoG.

  4. Tipos de Grafos.

  5. Lenguaje de consultas.

  6. Aprendizaje sobre grafos.

1.3.      Estructura del documento
   Capı́tulo 1: Introducción

   Este capı́tulo presenta el contexto y motivación del trabajo con el alcance del
mismo.

   Capı́tulo 2: Introducción a grafos

   El objetivo de este capı́tulo es relacionarse con los grafos y bases de datos orien-
tadas a grafos. También se compara contra otros motores de bases de datos.

   Capı́tulo 3: Base de datos orientada a grafos vs base de datos relacional

    Se comparan los RDBMS contra la BDoG en sus accesos a búsquedas: consultas
recursivas, devolver diferentes tipos de resultados y caminos. Además, la compara-
tiva abarca el modelado en la práctica mostrando las ventajas del grafo.

   Capı́tulo 4: Cuándo usar BDoG

    En este capı́tulo se brindan herramientas para identificar el uso de BDoG. Tam-
bién se detalla un árbol de decisión para mejorar la elección sobre la BDoG.

   Capı́tulo 5: Tipos de grafos

    El motivo de este capı́tulo es clasificar los tipos de grafos para reconocerlos en
los diferentes motores de base de datos de grafos.

   Capı́tulo 6: Tipos de gestores de BDoG

   En este capı́tulo se mencionan algunos tipos de BDoG mostrando la estructura
de almacenamiento. También se menciona el manejo de las transacciones, el modelo

                                                                              9
Estudio del estado del arte en bases de datos orientadas a grafos
de datos, las interfaces y lenguaje de consultas.

   Capı́tulo 7: Lenguajes de consultas BDoG

   Este capı́tulo se centra en la comparativa de los lenguajes de consultas Cypher,
Gremlin y Sparql con un ejemplo práctico de la actualidad.

   Capı́tulo 8: Aprendizaje sobre grafo

   En este capı́tulo se presentan distintas técnicas de aprendizaje sobre grafos.

   Capı́tulo 9: Conclusiones

   En este capı́tulo se reflexiona las lecciones aprendidas durante el transcurso del
trabajo.

                                                                            10
2. Introducción a grafos

    Las aplicaciones modernas se basan en datos, datos que aumentan constantemen-
te tanto en tamaño como en complejidad. Incluso a medida que crece la complejidad
de nuestros datos, también aumentan nuestras expectativas de la información que
nuestras aplicaciones pueden derivar de esos datos.

2.1.       ¿Qué es un grafo?
   Cuando miras una mapa de rutas o usas redes sociales como Facebook, Linke-
dIn o Twitter, usas un grafo. Los grafos son una forma casi ubicua de pensar en
escenarios del mundo real, ya que abstraen los elementos y las relaciones que se
representan, y esta abstracción permite un procesamiento rápido y eficiente de las
conexiones dentro de los datos.

    En los mapas, las ciudades se representan con frecuencia mediante cı́rculos, y
las carreteras que las conectan se representan mediante lı́neas. En una red social,
las personas se conectan entre sı́ a través de amigos o seguidores. Este proceso
de generalizar entidades y las conexiones entre ellas es la base fundamental de los
grafos y la teorı́a de grafos. Debido a que los matemáticos han definido y estudiado
los grafos durante siglos, podemos ofrecer estas definiciones utilizadas en la teorı́a
de grafos:

      Grafo: G = (V, A) donde V es un conjunto de vértices conectados por un
      conjunto de aristas A.

      Vértice: un punto en un gráfico donde cero o más bordes se encuentran,
      también conocido como un nodo o una entidad.

      Arista: una relación entre dos vértices dentro de un gráfico, a veces llamado
      relación, enlace o conexión.

    Si bien las definiciones son agradables, los grafos tienen la ventaja de ser simples
de ilustrar. Al trabajar con grafos, los diagramas generalmente consisten en cı́rculos
que representan vértices y lı́neas que representan aristas.

                                                                             11
Figura 2.1: Representación de grafos con cı́rculos para los vértices y lı́neas para las
aristas

    Los grafos no son conceptos nuevos para los desarrolladores de software. Éstas
son la base de muchas estructuras de datos comunes que usamos todo el tiempo,
probablemente sin siquiera darnos cuenta. Las estructuras de datos comunes, como
listas vinculadas y árboles, son simplemente tipos de grafos a los que se les apli-
can reglas especı́ficas. Si bien estas estructuras de datos son bien conocidas por los
desarrolladores, los detalles reales de implementación especı́ficos de los grafos gene-
ralmente se abstraen.

2.2.       ¿Qué es una base de datos orientada a grafos
          (BDoG)?
   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 vértices y aristas entre ellos.

    Por definición, una BDoG agruparı́a a cualquier solución de almacenamiento en
la que los elementos que están conectados se enlazan sin hacer uso de una referencia
por medio de ı́ndices (que serı́a el método habitual de simular una relación en una
RDBMS), de esta forma, los vecinos de una entidad son accesibles directamente por
ella por medio de una referencia directa, sin pasar por estructuras intermedias que
hagan el proceso de referenciado.

    En esta definición no tenemos en cuenta el tipo de grafo (en su sentido más
amplio) que nuestros datos seguirán, ni en el tipo de relación (dirigidas o no), ni en
la multiplicidad de las mismas entre dos vértices (unirelacional o multirelacional),
ni en la aridad que reflejen las aristas (grafo o hipergrafo).

                                                                              12
Por lo tanto, una BDoG cumple los siguientes criterios:
     El almacenamiento está optimizado para que los datos sean repre-
     sentados como un grafo, con una disposición para almacenar vértices y
     aristas.
     El almacenamiento está optimizado para el recorrido del grafo, sin
     usar un ı́ndice al seguir las aristas. Una BDoG está optimizada para consultas
     aprovechando la proximidad de los datos, comenzando desde uno o varios
     vértices raı́z, en lugar de consultas globales.
     Modelo de datos flexible para algunas soluciones: no es necesario declarar
     tipos de datos para vértices o aristas, a diferencia del modelo orientado a tablas
     más restringido de una base de datos relacional.
     API integrado con puntos de entrada para los algoritmos más clásicos de la
     teorı́a de grafos.
    Como punto final, las BDoG mejoran la productividad del desarrollador para
ciertos problemas de una manera que otras tecnologı́as no pueden. Almacenar los
datos de una manera que represente mejor a su contraparte del mundo real puede
facilitar que los desarrolladores razonen y comprendan el dominio en el que están
trabajando. Esto permite que los nuevos miembros del equipo se pongan al dı́a más
rápidamente en el dominio. Aprenden el dominio y la representación de su base de
datos simultáneamente.

2.3.      Comparación con otros tipos de bases de
         datos
    Debemos tener en cuenta que el mundo de las bases de datos no se limita a los
tipos de almacenes de datos relacional o de grafo. En los términos más amplios, una
base de datos se puede clasificar como un tipo de motor en una de las cinco formas
siguientes:
     Clave-Valor: representa todos los datos mediante un identificador único (una
     clave) y un objeto de datos asociado (el valor).
     Columna ancha u orientada a columnas: almacena datos en filas con un
     potencial de una gran cantidad de columnas y/o de columnas variables en cada
     fila.
     Documento: almacena datos en un documento con clave única que puede
     tener diferentes esquemas y que puede contener datos anidados.
     Relacional: almacena datos en tablas que contienen filas con un esquema
     estricto. Se pueden establecer relaciones entre tablas permitiendo la unión de
     filas.

                                                                             13
Grafo: almacena datos como vértices (también conocida como nodos) y aristas
        (también conocida como relaciones).

Figura 2.2: Tipos de motor de base de datos ordenados por complejidad de datos,
recuperado de [1]

    En la Figura 2.2 se puede observar que solo las RDBMS y las BDoG, por defecto,
incluyen la capacidad de relacionar entidades dentro de los datos. Puede ser posible
hacerlo con implementaciones para el resto, pero esto suele ser una mejora agregada
por la implementación especı́fica de un proveedor.

2.4.          ¿Por qué existen?
   Una de las formas para obtener los datos de un sistema es a través de la base de
datos relacional. Los RDBMS cuentan con el álgebra relacional1 y con un lenguaje
de consultas común para todas los fabricantes SQL (Structured Query Language)2 .

    Esta forma de almacenar y obtener los datos se ve afectada con la aparición
de la web 2.0, el desarrollo de software basado en navegadores web como también
la llegada de nuevas aplicaciones, como redes sociales, ecommerce, donde cualquier
usuario puede subir contenidos provocando ası́ un crecimiento exponencial de los
datos.

  1
      https://es.wikipedia.org/wiki/ %C3 %81lgebra relacional
  2
      https://es.wikipedia.org/wiki/SQL

                                                                           14
Dada la gran cantidad de datos sumado a problemas de escalabilidad y rendi-
miento donde hay escritura de miles de usuarios concurrentes y con millones de
consultas diarias surgió la necesidad de sistemas especifico apareciendo ası́ el movi-
miento NoSQL3 .

   Las bases de datos NoSQL son sistemas de almacenamiento que no cumple el
esquema entidad-relación. Tampoco tienen el formato de tabla donde almacenan sus
datos, hacen usos de otros formatos: clave-valor, mapeo de columnas, grafos.

     Las relaciones existen en la base de datos relacionales, pero solo en el momento
del modelado. En el momento de unir las tablas estas relaciones desaparecen y que-
dan expresadas en restricciones de claves foráneas4 para mantener la validez de los
datos, pero no queda la relación plasmada en el modelo fı́sico. De esta manera la
gran mayorı́a de consultas deben proyectar de varias tablas (JOIN) con estrategias
diversas para obtener los datos. Para entender podemos explorar el árbol de ejecu-
ción en una consulta SQL5 .

   A medida que los datos atı́picos se multiplican y la estructura general del con-
junto de datos se vuelve mas compleja y menos uniforme, el modelo relaciona se
sobrecarga con grandes tablas de combinaciones, filas escasamente pobladas y mu-
chos campos nulos, nos impiden el rendimiento y dificultan la evolución de una base
de datos existente a respuestas de nuevas funcionalidades, cambios en el sistema.

    Además tanto los RDBMS como las NoSQL están pensadas para almacenar co-
sas y no para entender como estas se relacionan entre si. Aquı́ es donde el modelo
orientado a grafos cobra sentido.

  3
    https://es.wikipedia.org/wiki/NoSQL
  4
    https://es.wikipedia.org/wiki/Clave foránea
  5
    https://slideplayer.es/slide/2747325/

                                                                             15
3. Base de datos orientada a grafos
   vs base de datos relacional

    Una BDoG es una buena opción para explorar datos estructurados como un gra-
fo (o derivados como un árbol), en particular cuando las relaciones entre esos datos
son tan significativas como los mismos datos. El caso ideal de una consulta serı́a
comenzar por uno o varios vértices y ejecutar recorridos de grafos.

    A pesar de sus nombres, las RDBMS están poco preparadas para explorar rela-
ciones de forma masiva, en donde necesita, por regla general, usar claves foráneas
accediendo a tablas intermedias. En BDoG los recorridos se realizan siguiendo pun-
teros fı́sicos, mientras que las claves externas son punteros lógicos.

   Aunque el siguiente ejemplo es muy simple, muestra un escenario en el que el
rendimiento de una BDoG es muy superior a la de una RDBMS. En ambos casos
tenemos la misma información y pretendemos extraer todos los trabajadores de una
determinada empresa. Por ejemplo, suponemos un caso para encontrar a todas las
personas que trabajan en Google.

    Con un modelo relacional podrı́amos ejecutar la siguiente consulta, que proba-
blemente necesitarı́a 3 búsquedas de ı́ndice correspondientes a las claves externas
del modelo.

            Figura 3.1: Ejemplo Tablas Company, adaptado de [2], [3]

                                                                           16
Figura 3.2: Ejemplo Tablas Company - SELECT, adaptado de [2], [3]

   En el caso de un grafo, la consulta necesitará una búsqueda de ı́ndice, luego
atravesará las relaciones desreferenciando punteros fı́sicos directamente.

             Figura 3.3: Ejemplo Tablas Company, adaptado de [2], [3]

   Este es un ejemplo muy simple, sin embargo, muestra una situación en la que el
rendimiento de una BDoG será superior al de una base de datos relacional.

    Esta diferencia de rendimientos puede parecer poco relevante cuando se trabaja
con pocos datos, pero a medida que el volumen se incrementa, esta diferencia se hace
notable. A pesar de que probablemente en la primera parte de la consulta la BDoG
también deba mirar un ı́ndice para encontrar los vértices iniciales para el recorrido,
en el resto de los pasos se hace por uso directo de los punteros fı́sicos que relacionan
los vértices (esta consulta se ejecutará más o menos en tiempo constante), mientras
que en la RDBMS es necesario buscar en al menos un ı́ndice (a menudo dos) cada
una de las referencias buscadas costará O(log2 n) si se usa un ı́ndice B-Tree (siendo
n el número de registros en la tabla).

    En cualquier caso, comparar modelos de bases de datos entre sı́ suele ser un
reto debido a las diferentes concepciones que tienen y a los distintos problemas que
intentan resolver. Podemos decir que, cuando la profundidad del recorrido sea im-
portante, o cuando no se conozca de antemano las BDoG son más eficientes que las
RDBMS, pero si la consulta se puede estructurar mucho, entonces hay herramientas
de optimización para RDBMS que pueden ofrecer resultados más eficientes. Uno de
los casos en los que las RDBMS no pueden optimizar sus consultas es precisamente
cuando la búsqueda es parametrizada y no se tiene a priori una forma estructurada

                                                                             17
uniforme, sino que depende de los resultados intermedios que se vayan obteniendo
a medida que se recorra el grafo.

3.1.         Consultas recursivas
    Las consultas recursivas se ejecutan varias veces seguidas, llamándose a sı́ mismas
repetidamente hasta que alcanzan alguna condición de escape o terminación. Las ba-
ses de datos relacionales no manejan bien las operaciones recursivas (especialmente
las ilimitadas), y tienen problemas tanto con la sintaxis como con el rendimiento.
Esto generalmente lleva a escribir y mantener consultas complejas, desnormalización
excesiva de nuestros datos, o ambos, todo en un esfuerzo por devolver resultados de
manera oportuna.

     En las RDBMS en general, las consultas recursivas son útiles cuando se trabaja
con datos autorreferenciales o estructuras de datos en forma de grafo / árbol. Es-
tas consultas aprovechan el llamado Common Table Expressions (CTE)1 que es la
cláusula SQL WITH.

       Observaremos la estructura formal de la consulta recursivas.

       Figura 3.4: Estructura formal de consulta SQL recursiva, recuperado de [4]

   En la estructura vemos que no es muy intuitiva además de la complejidad que
agrega para depurar como también el costo en términos de cómputos.

   Analizaremos un ejemplo sencillo para entender las partes de la consulta en una
RDBMS contra la BDoG, el ejemplo minimalista trata de una jerarquı́a de gestión
de una posible solución para una empresas. Se utilizo para el ejemplo en RDBMS
MySQL2 y para BDoG Neo4j3 .

   1
     https://social.technet.microsoft.com/wiki/contents/articles/37558.t-sql-common-table-
expression-cte.aspx
   2
     https://www.mysql.com/
   3
     https://neo4j.com/

                                                                                     18
Figura 3.5: Ejemplo de jerarquı́a de personas en una empresa

3.1.1.    Representación con RDBMS
   Para modelar la jerarquı́a (ver Figura 3.5 ), tenemos el siguiente esquema de
tabla e inserciones de los datos a continuación:

Figura 3.6: Representación del esquema en MySQL - ejemplo de jerarquı́a de perso-
nas en una empresa

                                                                         19
Luego usamos una función recursiva para consultar estos datos para encontrar
la jerarquı́a de administración del presidente (ver Figura 3.7).

Figura 3.7: Código recursivo RDBMS - ejemplo de jerarquı́a de personas en una
empresa, adaptado de [4], [5]

    Lo primero es montar una CTE que busque el elemento de partida. Con las lı́neas
del código de recursivas podemos identificar sobre una consulta tipo:

     En las lı́neas del 1 a 3 se define el CTE.

     En las lı́neas del 4 a 6 identificamos el primer elemento de la estructura
     jerárquica, nodo o raı́z. El WHERE implica el punto de partida.

     En la lı́nea 7 preparamos el conjunto recursivo.

     En la lı́nea 8 por ser UNION ALL devolvemos el mismo numero de elementos
     y tipos.

     En las lı́neas 9 al 10 se relacionan la tabla origen con la tabla de expresión
     común o lo que es lo mismo la recursividad.

     En la lı́nea 11 se indica que tiene que buscar los elementos de la tabla origen
     en los cuales su columna padre, apunte al id que tenga en ese instante el CTE.

     En las lı́neas 12 y 13, la salida de la tabla con expresión común.

   El resultado de la consulta (ver Figura 3.1.1).

                                                                            20
Figura 3.8: Salida de la consulta recursiva - ejemplo de jerarquı́a de personas en una
empresa

3.1.2.       Representación con BDoG
   Para modelar esta jerarquı́a con neo4j se utilizó el lenguaje de consultas Cypher4
en primer lugar creamos los vértices (nodos) y luego las aristas (relaciones) (ver
Figura 3.9, Figura 3.10).

   Figura 3.9: Crear vértices - ejemplo de jerarquı́a de personas en una empresa

  4
      https://neo4j.com/developer/cypher/

                                                                            21
Figura 3.10: Crear relaciones - ejemplo de jerarquı́a de personas en una empresa

Figura 3.11: Consulta lenguaje Cypher para neo4j - ejemplo de jerarquı́a de personas
en una empresa

   Este ejemplo (ver Figura 3.11) demuestra la naturaleza sencilla con la que pue-
de hacer preguntas de forma recursiva en un grafo. Las BDoG utilizan sus ricas
representaciones de relaciones para manejar estas consultas recursivas ilimitadas de
manera limpia y eficiente.

    Este recorrido se corresponde naturalmente con nuestro instinto de navegar vi-
sualmente por la jerarquı́a de los datos. Podemos intuir que desde el vértice persona
presidente quiero obtener todas las aristas hacia el resto de las personas con la re-
lación TRABAJA CON.

    Por otro lado, las BDoG también pueden visualizar el resultado en forma de
grafo. Y comparando con Figura 3.5 que fue la estructura de partida, obtendremos
el mismo resultado (no hubo cambio con el dominio de la solución) Figura 3.12.

                                                                            22
Figura 3.12: Resultado de neo4j - ejemplo de jerarquı́a de personas en una empresa

3.2.       Diferentes tipos de resultados
   Cuando se necesitado devolver varios tipos de datos diferentes de una base de
datos, todo dentro de un único conjunto de resultados.

    Veamos cómo se comparan las RDBMS y BDoG cuando devuelven diferentes
tipos.

    Para esto tomaremos un ejemplo de un sistema de procesamiento de ordenes y
queremos devolver la información de las órdenes y los productos. Es una implemen-
tación simple para cada base de datos con la intención de comparar ambos mundos.

3.2.1.    Representación con RDBMS
    Es posible lograr esto con una unión de todas las columnas en todas las tablas,
tiende a producir resultados menos que ideales.

                                                                          23
Figura 3.13: Tablas de productos y ordenes en una RDBMS, adaptado de [1]

   El siguiente fragmento de código muestra cómo escribir una consulta para recu-
perar la información de órdenes y productos.

Figura 3.14: Fragmento de código SQL para la consulta - órdenes y productos,
adaptado de [1]

Figura 3.15: Resultado de la consulta SQL – órdenes y productos, adaptado de [1]

    Vemos en el resultado que la unión de estos dos tipos de datos dispares dicta
que nuestra respuesta contiene una gran cantidad de valores nulos (comúnmente
conocidos como datos dispersos o matriz dispersa)5 . Esta abundancia de datos nulos
se debe a que las columnas entre las dos tablas son inconsistentes.

    Una RDBMS especifica que el conjunto de resultados devuelto debe contener un
conjunto coherente de columnas. En los casos de datos escasos, esto no solo aumenta
la cantidad de datos devueltos, sino que también reduce la naturaleza descriptiva de
la estructura de datos.

3.2.2.        Representación con BDoG
   Uno de los puntos fuertes de una base de datos orientada a grafos es la capacidad
de devolver diferentes tipos de datos en los resultados.
  5
      https://es.wikipedia.org/wiki/Matriz dispersa

                                                                           24
Figura 3.16: Grafo de producto y ordenes en BDoG – neo4j

   Con este grafo, podemos escribir una consulta para devolver tanto los datos del
producto como del pedido muy simple sin contener valores nulos.

         Figura 3.17: Fragmento de código Cypher – neo4j y su resultado

    En comparación con los resultados anteriores de SQL, los datos devueltos por el
grafo conservan el significado semántico de lo que es el objeto y lo que representa,
sin los datos nulos extraños.

   Debido a que las BDoG brindan la flexibilidad para devolver datos dispares,
podemos crear un código mucho más limpio cuando trabajamos con tipos de datos
muy variados.

3.3.       Caminos
   Un camino es la secuencia de vértices y aristas que describen cómo se movió el
recorrido a través del grafo.

    Representa problemas fundamentales que se encuentran en muchas aplicaciones
del mundo real, como encontrar un camino en un mapa, encontrar el uso óptimo

                                                                           25
de recursos en un sistema logı́stico, localizar conexiones entre personas en una red
social, etc. Cada uno de estos casos se trata fundamentalmente de determinar el
conjunto óptimo de pasos para pasar de una entidad a otra. La estructura de datos
del grafo nos permite aprovechar estas capacidades de búsqueda de caminos, que no
son una construcción nativa en otros tipos de bases de datos.

    Usando una RDBMS, no podemos encontrar una manera de resolver caminos
óptimos sin usar un método de fuerza bruta para calcular todas las combinaciones
posibles. Sin embargo, con un modelado de datos un poco inteligente y el poder de
un algoritmo de búsqueda de caminos, es bastante sencillo resolver el/los caminos
que satisfaga el problema con un grafo.

   La capacidad de devolver como dos entidades, están conectados entre sı́, desde
dentro de la base de datos es una caracterı́stica exclusiva de las BDoG.

3.4.       Modelado BDoG
    Por último, una caracterı́stica en la que las BDoG no tienen rival es en su faci-
lidad para modelar y adaptarse a modelos cambiantes, modelar datos como un
grafo es natural y tiene la ventaja de ser legible incluso para personas sin conoci-
mientos técnicos.

    En RDBMS lo habitual tras diseñar un modelo de datos es pasar a normalizarlo
para asegurarnos el correcto funcionamiento del modelo relacional sobre los datos,
pero el modelado usando BDoG es tan natural que el modelado puede hacerse sin
conocimientos técnicos explı́citos, puesto que el modelo de datos de la BDoG y el
de los datos que se quieren almacenar es, en la mayorı́a de los casos, el mismo (es-
ta afirmación es voluntaria y exageradamente simplista, pero refleja un hecho muy
cercano al mundo real).

   Un ejemplo simplista: representar un problema comercial y las entidades asocia-
das.

                                                                            26
Figura 3.18: Modelo del negocio (simulando pizarra), recuperado de [3]

   Luego, cuando se ha elegido el sistema de almacenamiento, se debe incorporar
el modelo de datos.

    Si se elige una base de datos relacional, generalmente se comienza normalizando
el modelo para que cumpla con la tercera forma normal, y podrı́a verse ası́:

                Figura 3.19: Modelo relacional, recuperado de [3]

   Pero si uno elige modelar los datos con una BDoG, probablemente se verá ası́:

                                                                         27
Figura 3.20: Modelo de Grafo, recuperado de [3]

                                                  28
4. Cuándo usar BDoG

   Como saber si es una buena opción usar BDoG, lo identificaremos de una manera
genérica.

    Estamos de acuerdo en que el mundo real se describe fácilmente en términos de
grafos, pero decir que todo se resuelve con un tipo de base de datos es una simplifi-
cación drástica. El hecho de que un problema se pueda representar como un grafo no
significa necesariamente que una BDoG sea la mejor tecnologı́a para elegir resolver
ese problema.

    El proceso comienza con una simple pregunta: ¿Qué problema estamos tratan-
do de resolver? Responder a esta pregunta proporciona detalles cruciales sobre qué
preguntas vamos a hacer, y esto rige los tipos de datos que necesitamos almacenar
y cómo debemos recuperarlos.

   Desglosamos las respuestas en las siguientes categorı́as de problemas:

     Selección - búsqueda.

     Datos relacionados o recursivos.

     Agregación.

     La coincidencia de patrones.

     Centralidad, agrupación e influencia.

4.1.     Selección - búsqueda
   Las preguntas sobre las selección-búsqueda se enfocan de manera estricta en
encontrar un pequeño conjunto de entidades que comparten un atributo común
como el nombre, la ubicación o el empleador:

     ¿Quiénes trabajan en X empresa?

     ¿Quién en mi sistema tiene un nombre como John?

     ¿Dónde están los comercios dentro de X kilómetros?

                                                                            29
Este tipo de preguntas no requieren relaciones ricas dentro de los datos. En la
mayorı́a de las bases de datos, responder a estas preguntas requiere utilizar un único
criterio de filtrado o, potencialmente, un ı́ndice.

   Debido a que estos problemas no aprovechan las relaciones en nuestros datos, es
poco probable que valga la pena asumir las complejidades adicionales de las BDoG.

   En este caso es recomendable usar RDBMS.

4.2.      Datos relacionados o recursivos
   Las preguntas que exploran las relaciones entre entidades agregan significado y
brindan valor topológico a los datos, proporcionando un caso de uso sólido para una
BDoG.

   Algunos ejemplos de este tipo de preguntas incluyen:

     ¿Cuál es la forma más fácil de que me presenten a un ejecutivo de X empresa?

     ¿Cómo se conocen John y Paula?

     ¿Cómo se relaciona la empresa X con la empresa Y?

    Las BDoG aprovechan esta información mejor que cualquier otro tipo de motor
de datos, y sus lenguajes de consulta son más adecuados para razonar sobre las re-
laciones dentro de los datos. Aunque no es imposible en bases de datos relacionales,
este tipo de consultas de amigos de amigos requieren complejas y difı́ciles de man-
tener o razonar sobre CTE recursivas o combinaciones complejas en muchas tablas
diferentes.

   En este caso es recomendable usar BDoG.

4.3.      Agregación
   Las consultas de agregación de datos constituyen un excelente caso de uso para
una RDBMS. Las mismas están optimizadas para realizar consultas de agregación
complejas de forma rápida y con una sobrecarga mı́nima.

   Las preguntas de ejemplo pueden incluir:

     ¿Cuántas empresas hay en mi sistema?

     ¿Cuáles son mis ventas promedio de cada dı́a durante el último mes?

     ¿Cuál es la cantidad de transacciones procesadas por mi sistema cada dı́a?

                                                                             30
Estos mismos tipos de consultas se pueden realizar en BDoG, pero la naturale-
za de los recorridos de grafos requiere que se toquen muchos más datos. Pero esto
provoca una mayor latencia de consulta y utilización de recursos.

   En este caso es recomendable usar RDBMS.

4.4.      Coincidencia de patrones
   La coincidencia de patrones basada en cómo se relacionan las entidades es un
excelente ejemplo de cómo aprovechar el poder de las BDoG. Los casos de uso tı́pi-
cos para este tipo de consultas involucran cosas como motores de recomendación,
detección de fraude o detección de intrusiones.

   Algunas preguntas pueden incluir:

      ¿Quién en mi sistema tiene un perfil similar al mı́o?

      ¿Esta transacción se parece a otras transacciones fraudulentas conocidas?

      ¿El usuario J. Smith es el mismo que Johan S.?

   Los casos de uso de coincidencia de patrones se realizan con tanta frecuencia
en BDoG que los lenguajes de consulta de grafos tienen caracterı́sticas integradas
especı́ficas para manejar con precisión este tipo de consultas.

   En este caso es recomendable usar BDoG.

4.5.      Centralidad, agrupación e influencia
   La influencia o importancia relativa de una entidad en comparación con otra es
un caso de uso tı́pico de una BDoG.

   Algunas preguntas de ejemplo pueden incluir:

      ¿Quién es la persona más influyente con la que estoy conectado en LinkedIn?

      ¿Qué equipo de mi red tiene el impacto más sustancial si se rompe?

      ¿Qué partes tienden a fallar al mismo tiempo?

    Ejemplos de otros problemas de este tipo incluyen encontrar a la persona más
influyente en una red de Twitter, identificar piezas crı́ticas de infraestructura o ubi-
car grupos de entidades dentro de sus datos.

   Calcular las respuestas a este tipo de problemas requiere observar las entidades,
sus relaciones y las relaciones de incidentes y entidades adyacentes.

                                                                             31
Al igual que con los casos de uso de coincidencia de patrones, estos tipos de
problemas a menudo tienen caracterı́sticas especı́ficas de lenguajes de consulta de
grafo incorporados.

   En este caso es recomendable usar BDoG.

4.6.     Guı́a para decidir
   ¿Deberı́a usar una base de datos orientada a grafo? Desde el árbol de decisión
avanzamos contestando las preguntas hasta llegar a un estado de sı́, no o quizás.

        Figura 4.1: Árbol de decisión – utilizar un BDoG, adaptado de [1]

                                                                          32
¿Nos preocupan las relaciones entre entidades tanto o más que las
propias entidades?

    Esta pregunta es quizás la pista más crı́tica. Habla del corazón de una de las ca-
racterı́sticas más poderosas de las BDoG: las relaciones son tan significativas como
las entidades.

   Si nuestra respuesta a esta pregunta es sı́, entonces probablemente necesitemos
un modelo de datos que permita representaciones sofisticadas de las relaciones, un
candidato excelente para usar una BDoG. Pero si nuestra respuesta es no, entonces
quizás otro motor de datos serı́a una mejor opción.

   ¿Mi consulta SQL realiza múltiples combinaciones en la misma tabla
o requiere un CTE recursivo?

   Si bien una gran cantidad de combinaciones en una consulta SQL puede indicar
que una BDoG podrı́a ser una buena opción, no asegura esa posibilidad. Un gran
número de combinaciones en una consulta SQL suele ser un signo de un modelo
de datos bien normalizado. Pero cuando esas uniones no se utilizan para recuperar
datos de referencia (como se hace con una tercera forma normal en una base de
datos relacional) y, en cambio, se utilizan para vincular elementos juntos (como con
una relación padre-hijo), entonces es posible que deseemos considerar una BDoG.

   Además, los patrones de consulta recursivos se benefician de las BDoG cuando
no sabemos el número de uniones que se realizarán.

   ¿La estructura de mis datos evoluciona continuamente?

   Las RDBMS tienen una reputación bien merecida por la rigurosidad de su es-
quema y la complejidad asociada al realizar cambios de esquema.

    Si su problema requiere tomar datos con diferentes esquemas de datos, entonces
vale la pena investigar una BDoG.

    La flexibilidad con el esquema de datos por sı́ sola no deberı́a ser una razón
suficiente para elegir una BDoG, sin embargo, combinada con otras caracterı́sticas,
podrı́a ser suficiente para inclinar la balanza a favor del uso de una BDoG.

   ¿Es mi dominio un ajuste natural para un grafo?

    Si está haciendo algo como enrutamiento, administración de dependencias, análi-
sis de redes sociales, etc. entonces su problema gira en torno a datos altamente in-
terconectados, por lo que su dominio puede ser adecuado para usar un grafo.

   Una advertencia: aunque su dominio se modela naturalmente en un grafo, si
sus preguntas no se basan en las relaciones del grafo para las respuestas, entonces

                                                                              33
deberı́a considerar otras opciones.

4.7.        Algunos usos de la BDoG
    Las potencialidades múltiples de las BDoG las hacen atractivas para diferentes
tipos de proyectos. Existen condiciones especiales donde es casi obligatorio pensar
en implementar una.

      Detección de fraude

    Sirven para estudiar patrones relacionales que se presentan en las estrategias que
utilizan los delincuentes para cometer fraude.

    Esta potencialidad es muy útil para empresas del sector financiero y bancario
donde es difı́cil ver por donde circula el dinero, sobre todo si se usan empresas pan-
talla o empresas en paraı́sos fiscales, testaferros, sociedades, etc. Al final tenemos un
conjunto de datos de diferentes fuentes, pero con relaciones directas o indirectas di-
ficultando el seguimiento del dinero y por tanto ocultando el fraude. Con un modelo
basado en grafos, nos facilita el trabajo pudiendo seguir la pista, sobre todo si hay
una representación visual de los datos, ejecutando consultas y búsquedas de los ele-
mentos, llegando a establecer las relaciones por donde haya podido circular el dinero.

      Sistema de recomendación

   Al tener la capacidad de mostrar las relaciones complejas entre vértices estas nos
brindan la posibilidad de establecer aristas entre personas e intereses.

      Su implementación ha ayudado a las redes sociales a optimizar su funcionamien-
to.

    También es una gran oportunidad para las empresas ya que con información de
esta clase pueden optimizar sus productos y servicios a los intereses de su público,
donde un cliente tiene una compra pendiente de un producto, y por relación de
similitud o proximidad de productos te ofrece otros para completar el pedido. Esto
se consigue gracias a que entre ambos productos existe una o varias relaciones.

      Cálculo de rutas en logı́stica

   Son capaces de aplicar el algoritmo del camino más corto, usando algoritmos de
Kruskal1 , Dijkstra2 o Prim3 . Lo que le facilita a la empresa el cálculo y reducción
de costos en la selección de las rutas.

  1
    https://es.wikipedia.org/wiki/Algoritmo de Kruskal
  2
    https://es.wikipedia.org/wiki/Algoritmo de Dijkstra
  3
    https://es.wikipedia.org/wiki/Algoritmo de Prim

                                                                              34
Relaciones sociales

   Donde mayor uso se le puede dar y en donde mejor encajan.

   En este caso hay múltiples ejemplos, desde temas relacionados con el cine, per-
sonajes, actores, directores, etc.

   También lo podemos usar para modelar el conocimiento adquirido por los em-
pleados, que tecnologı́as conocen, en qué proyectos han estado trabajando, con qué
personas han estado trabajando.

   Modelos de redes

   Donde una red de sistemas o computadoras puede ser representado por un grafo.

                                                                          35
5. Tipos de grafos

   En el capı́tulo 3: Introducción a grafos vimos la definición de grafos.

   Ahora veremos algunos tipos de grafos.

5.1.     Grafo no dirigido
   Un grafo no dirigido es un tipo de grafo en el cual las aristas representan rela-
ciones simétricas y no tienen un sentido definido.

   Formalmente, se definen por un par de conjuntos G = (V, E), donde:

     V 6= ∅ es el conjunto no vacı́o de vértices.

     E ⊆ {(a, b) ∈ V xV } es el conjunto de aristas, tal que (a, b) = (b, a).

   Figura 5.1: Grafo no dirigido con dos vértices y una arista, recuperado de [6]

5.2.     Grafo dirigido
    Un grafo dirigido es un tipo de grafo en el cual las aristas tienen un sentido
definido.

   Formalmente, se definen por un par de conjuntos G = (V, E), donde:

     V 6= ∅ es el conjunto no vacı́o de vértices.

     E ⊆ {(a, b) ∈ V × V : a 6= b} es un conjunto de pares ordenados de elementos
     de V donde una arista va del primer vértice (a) al segundo vértice (b).

                                                                           36
Figura 5.2: Grafo dirigido con tres vértices y tres aristas dirigidas, recuperado de [7]

5.3.      Grafo con peso o ponderado
     Es un grafo dirigido o no dirigido, donde las aristas tienen algún tipo de valora-
ción.

              Figura 5.3: Grafo no dirigido con peso, recuperado de [8]

5.4.      Grafo con etiquetas
    Es un grafo dirigido o no dirigido, donde se incorporan etiquetas que pueden
definir los distintos vértices y también las aristas entre ellos.

    Formalmente, dado un grafo G, un vértice etiquetado es una función que hace
corresponder vértices de G a un conjunto de etiquetas. De la misma manera, una
arista etiquetada es una función que hace corresponder aristas de G a un conjunto
de etiquetas.

            Figura 5.4: Grafo dirigido con etiquetas en vértices y aristas

                                                                              37
5.5.     Grafo de propiedades
   Es el más complejo, es un grafo con etiquetas y donde podemos asignar propie-
dades tanto a vértices como a sus aristas.

Figura 5.5: Grafo dirigido de propiedades, vértices con etiqueta “Person” y pro-
piedades (Id, Name, Age), aristas con etiqueta “Knows” y propiedades (Id, Since),
recuperado de [9]

5.6.     Multigrafo
   Los multigrafos pueden ser grafos no dirigidos o grafos dirigidos y con la combi-
nación de grafo con peso, grafos con etiquetas y/o grafos de propiedades.

   Con la diferencia que las aristas pueden ser un conjunto en un mismo vértices o
entre un par de vértices.

Figura 5.6: Multigrafo con vértices que representan departamentos y sus aristas
distintas opciones de llegar al destino

                                                                          38
6. Tipos de gestores de BDoG

6.1.        Neo4j
    Neo4j es la base de datos orientada a grafos más polular según db-engines.com1
a la fecha de este trabajo, es una plataforma de base de datos de grafos nativa que
está diseñada para almacenar, consultar, analizar y administrar datos altamente
conectados de manera eficiente.

6.1.1.       Modelo de datos
    El modelo de datos utilizado por Neo4j es un grafo de propiedades etiquetado
(ver Sección 5.5). Por tanto, las unidades básicas de procesamiento en Neo4j son:
vértices, aristas entre vértices, etiquetas que permiten definir el tipo de los vértices
y de las aristas y también las propiedades (definidas sobre vértices y/o aristas).

   En Neo4j se utilizan los dos puntos “:” para representar las etiquetas. Las pro-
piedades se acostumbran a representarse en minúsculas.

    Por otro lado, para distinguir fácilmente las etiquetas de vértices de las de aris-
tas, en Neo4j se escriben las etiquetas de aristas en mayúsculas y las etiquetas de
vértices con la primera letra en mayúscula y el resto en minúsculas.

   Como ejemplo :Libro, :Persona y :HA LEÍDO entonces Libro y Persona son eti-
quetas de los vértices mientras que HA LEÍDO representa la etiqueta de la relación.

6.1.2.       Restricciones de integridad
   En Neo4j es posible aplicar ciertas restricciones de integridad sobre los esquemas.
Estas restricciones son:

        Unicidad (UNIQUE): permite indicar que el valor de una propiedad debe
        ser único para todos los vértices del mismo tipo.

        Existencia: permite indicar que una propiedad (o un conjunto de ellas) debe
        existir para todos los vértices de un tipo.
  1
      https://db-engines.com/en/ranking/graph+dbms

                                                                                39
Clave (PRIMARY KEY): permite indicar que una propiedad es clave para
     todos los vértices de un determinado tipo, es decir, que todos sus vértices
     deben tener definida la propiedad y que el valor de la propiedad es único.

6.1.3.    Manejo de transacciones
    Para mantener completamente la integridad de los datos y garantizar un buen
comportamiento transaccional, Neo4j admite las propiedades ACID (ver en el Capı́tu-
lo 10).

Interfaces de consultas
   Neo4j permite acceder a sus datos de diversas formas:

     Desde consola.

     Un entorno web gráfico.

     Mediante API.

Lenguaje de consultas
   Neo4j permite consultar sus datos de distintos lenguajes de consulta:

     Cypher, que es un lenguaje declarativo que permite consultar y manipular
     grafos.

     Gremlin, que es un lenguaje especı́fico de dominio para la gestión de grafos.

6.1.4.    Almacenamiento fı́sico de la estructura de datos
   Neo4j almacena los datos en una serie de archivos de almacenes diferentes, cada
archivo de almacén contiene una parte especı́fica del grafo, entre ellos:

     Archivo de almacenamiento de vértices.

     Archivo de almacenamiento de aristas.

     Archivo de almacenamiento de propiedades.

     Archivo de almacenamiento de tipos de relaciones.

     Otros.

                                                                           40
Almacenamiento de vértices
   Este archivo como su nombre lo indica solo almacena registro de vértices y el
nombre fı́sico es neostore.nodestore.db.

   Es un almacenamiento de registros fijos donde cada registro tiene 9 bytes de
longitud. Esto le permite a Neo4j búsquedas rápidas en este archivo con un costo
de O(1).

             Figura 6.1: Neo4j registro de vértice de largo fijo (9 bytes)

    En la Figura 6.1 tenemos un registro del vértice donde el byte 1 es la marca de
uso, indica si el registro se esta usando actualmente los siguientes bytes del 2 al 5
(4 bytes) contiene el identificador del primer registro de la arista y el resto del 6 al
9 (4 bytes) identifica el registro de la primera propiedad.

   Resumiendo, el registro del vértice es un par de punteros a listas de aristas y
propiedades identificando el primero de cada lista.

Almacenamiento de aristas
   Este archivo como su nombre lo indica solo almacena registro de aristas y el
nombre fı́sico es neostore.relationshipstore.db.

   Al igual que el registro de vértices, el registro de aristas es de longitud fija de 33
bytes. Con el cual Neo4j consulta con un costo de O(1).

                                                                               41
Figura 6.2: Neo4j registro de arista de largo fijo (33 bytes)

    En la Figura 6.2 es un registro de arista donde el 1 byte es la marca de uso con
la misma funcionalidad de la marca de uso para el registro de vértice. Los bytes
siguientes del 2 al 5 (4 bytes) tiene el identificador al vértice inicial y los otros 4
bytes del 6 al 9 el identificador del vértice final. Los bytes del 10 al 13 (4 bytes) el
identificador de tipos de aristas (que también están en un archivo de almacenamien-
to). El resto de los bytes del 14 al 29 (16 bytes) tiene el identificador de las aristas
anterior y siguiente de cada vértice inicial y final mientras que los bytes del 30 al 33
(4 bytes) es el identificador a la primera propiedad.

   Punteros de los registros vértices-aristas

            Figura 6.3: Neo4j estructura de punteros, recuperado de [10]

   En la Figura 6.3 se visualiza como interactúan los distintos archivos de almace-
namiento en disco. Cada registro de los 2 vértices contiene un puntero a la primera
propiedad y relación en una cadena de relaciones.

   Para leer las propiedades de un vértice como arista se sigue la estructura de lista
simples enlazadas comenzando con el puntero a la primera propiedad.

                                                                              42
Para leer las aristas de un vértice se sigue la estructura de lista doblemente enla-
zadas comenzando con el puntero a la primera arista. En el caso particular de querer
leer una arista determinada, seguimos el mismo procedimiento y al encontrarla po-
demos leer sus propiedades (si las tiene) o se puede examinar los dos registros de los
vértices que conecta esa arista mediante sus identificadores de vértice inicial y vérti-
ce final. Estos identificadores multiplicados por el tamaño del registro del vértice (9
bytes) obtenemos el desplazamiento inmediato en el archivo de almacenamiento de
vértices.

   Al tener las aristas con la estructura de listas dobles enlazadas permite recorrer
en cualquier dirección e insertar y eliminar de forma eficiente.

6.1.5.     Datos en cache
   Representados por dos objetos en memoria: vértices y aristas.

    Las representaciones de las propiedades tanto en vértices como en aristas son de
clave, valor.

    Los objetos de vértices agrupan sus aristas por tipo de relación y su dirección,
si son entrantes o salientes.

Figura 6.4: Neo4j – estructura minimalista de nodo y relación, mostrando el ciclo
para recorrer todos los nodos de algún tipo de relación

                                                                                43
Para entender esto supongamos que tenemos un grafo que representa las relacio-
nes de amistad entre personas, las ciudades donde viven y el automóvil que manejan.
Como se aprecia en la Figura 6.5. Se puede observar en cada relación el id que es la
referencia directa a dicha relación.

                   Figura 6.5: Neo4j - ejemplo nodos y relaciones

    Suponiendo que queremos obtener los amigos de Miguel, tenemos los tipos de
relación ES AMIGO, VIVE EN y CONDUCE, pero solo nos interesa la relación de
amistad los demás tipos se descartan y se itera sobre la lista de salida y se obtienen
los vértices Carlos, Luis, Ana de forma directa.

           Figura 6.6: Neo4j - ejemplo del ciclo para obtener los amigos

                                                                             44
6.2.       ArangoDB
      ArangoDB se encuentra en el puesto 3 del grupo BDoG db-engines.com2 .

   Es una plataforma de base de datos diseñada para almacenar datos de forma
nativa como grafo, pares clave-valor y documentos a los que se puede acceder con
un lenguaje de consulta único.

6.2.1.      Modelo de datos
    Es una base de datos multi-modelo porque combina los modelos clave/valor, do-
cumentos y grafos en un solo núcleo desarrollado en C++. Poseé un lenguaje de
consulta unificado AQL (ArangoDB Query Language) que permite realizar consul-
tas entre los diferentes modelos de datos indistintamente. Soporta un multigrafo
dirigido de propiedades.

   Tanto las aristas como los vértices son colecciones de documentos en formato
JSON.

 Figura 6.7: ArangoDB – vertices y aristas en formato JSON, recuperado de [11]

6.2.2.      Restricciones de integridad
   Solo cuenta con la clave primaria (atributo Key), pero se pueden definir otras
cumpliendo ciertas restricciones definidas por ArangoDB3 .

6.2.3.      Manejo de transacciones
   ArangoDB soporta transacciones ACID (ver en el Capı́tulo 10), las transacciones
son siempre operaciones del lado del servidor.

  2
    https://db-engines.com/en/ranking/graph+dbms
  3
    https://www.arangodb.com/docs/stable/data-modeling-naming-conventions-document-
keys.html

                                                                              45
Se realiza con una función de JavaScript db. executeTransaction(object) donde
object contiene diferentes atributos (colecciones, acción, opcionales).

Índices
   ArangoDB indexa automáticamente algunos atributos del sistema y también per-
mite crear ı́ndice a los usuarios, pero a nivel de colección. Los ı́ndices son:

   Índices persistentes
Es un ı́ndice ordenado con persistencia en disco.

    Índices TTL
Se puede utilizar para eliminar automáticamente documentos caducados en la co-
lección.

   Índices de texto completo
Para indexar texto completo dentro de los documentos.

    Índices geográficos
Índice que almacena coordenadas bidimensionales con los atributos latitud y longi-
tud que tienen que ser de tipos numéricos.

    Índices centrados en vértices
Son los mas importantes para el grafo donde se indexan los atributos de las aristas
(atributos from y to). Proporcionan un acceso rápido a todas las aristas que se
originan o llegan a un vértice dado y permiten encontrar rápidamente los vecinos de
un vértice en el grafo.

Interfaces de consultas
   La gestión de la base de datos se pueden hacer a través de las interfaces:

     Web.

     ArangoSH.

     REST/ API.

Lenguaje de consultas
    El lenguaje de consulta de ArangoDB es declarativo y permite la combinación de
diferentes patrones de acceso a datos en una sola consulta AQL (ArangoDB Query
Lenguage).

                                                                            46
6.2.4.       Almacenamiento fı́sico de la estructura de datos
    ArangoDB tiene una estructura distinta para el almacenamiento del grafo donde
se cuestiona el ı́ndice de adyacencia4 . Este usa un hı́brido entre ı́ndice y lista doble-
mente encadena.

    El almacenamiento de los vértices está referenciado a un hash que fue creado por
la clave del vértice. De igual forma se almacenan las aristas.

    Cada vértice tiene referencia al identificador de la primera arista en el hash de
aristas, y las aristas siguientes están en la estructura de lista doblemente encadenada,
recorriendo la lista se obtiene todas sus relaciones.

Figura 6.8: ArangoDB – Hash hı́brido con listas vinculadas - ı́ndices, adaptado de
[12]

6.3.        TerminusDB
   TerminusDB se encuentra en el puesto 25 (mayo 2021) del grupo BDoG de db-
engines.com5 . Es una plataforma de base de datos de grafos en memoria.

  4
      https://en.wikipedia.org/wiki/Talk:Graph database#Changed opening paragraph
  5
      https://db-engines.com/en/ranking/graph+dbms

                                                                                    47
6.3.1.     Modelo de datos
   Es un grafo dirigido de propiedades etiquetados.

         Figura 6.9: TerminusDB – grafo de propiedades, recuperado de [13]

   En TerminusDB todo es un objeto de una clase. Los objetos pueden tener pro-
piedades, y las propiedades pueden vincularse a otros objetos.

   De la Figura 6.9 se identifican 4 estructuras principales:

     OrdinaryClass.

     DocumentClass (doc:Person).

     ObjectProperty (knows:doc:Person).

     DatatypeProperty (name:String).

   Las clases de documentos son clases de nivel superior. Continuando con la Figu-
ra 6.9 los vértices Marı́a , Anna , Tom y Jim son objetos de documento. knows es
una propiedad de objeto y con alcance al documento de persona.

    Las clases pueden ser subclases de otras clases, lo que significa que heredan todas
las propiedades de los padres (al igual que la herencia en la programación orientada
a objetos). Se admite también la herencia múltiple.

   El tipo de datos al que apunta la propiedad puede ser un simple literal de tipo
de datos DatatypeProperty o puede ser una clase ObjectProperty.

    TerminusDB es una base de datos de grafos que almacena datos como Git con los
mismos beneficios como tener registro de quienes hicieron confirmaciones, permite
volver a un estado anterior y la mayor motivación de TerminusDB es poder clonar
el conjunto de datos y hacer las modificaciones necesarias y sincronizar los datos
para dejarlo en el nuevo estado, esto permite que diferentes desarrolladores pueden

                                                                             48
También puede leer