Introducción a Neo4j - Programación de Bases de Datos

Summary

Este documento es una introducción al tema de programación de bases de datos, con un enfoque especial en Neo4j, un sistema de gestión de bases de datos orientado a grafos. El documento cubre conceptos clave relacionados con grafos, bases de datos y sus ventajas.

Full Transcript

Índice [[Esquema] 3](#_Toc179750157) [[Ideas clave] 4](#_Toc179750158) [[8.1. Introducción y objetivos] 4](#_Toc179750159) [[8.2. Bases de datos orientadas a grafos] 6](#_Toc459888456) [[8.3. Bases de datos orientadas a grafos contra SQL y NoSQL] 8](#_Toc459888457) [[8.4. Las relaciones y los...

Índice [[Esquema] 3](#_Toc179750157) [[Ideas clave] 4](#_Toc179750158) [[8.1. Introducción y objetivos] 4](#_Toc179750159) [[8.2. Bases de datos orientadas a grafos] 6](#_Toc459888456) [[8.3. Bases de datos orientadas a grafos contra SQL y NoSQL] 8](#_Toc459888457) [[8.4. Las relaciones y los grafos] 11](#_Toc507053630) [[8.5. Neo4j. Conceptos básicos] 12](#_Toc179750163) [[8.6. Introducción a Cypher] 18](#_Toc179750164) [[8.7. Consultas basadas en relaciones] 37](#_Toc179750165) [[8.8. Cuaderno de Ejercicios] 45](#_Toc179750166) Esquema Ideas clave []{#_Toc179750159.anchor}8.1. Introducción y objetivos Las bases de datos basadas en grafos usan el concepto de grafos para modelar la información guardada, ponderando al mismo nivel las entidades (o nodos) y sus relaciones. Surgen como una evolución del paradigma NoSQL convencional, el cual no garantiza los parámetros ACID como al nivel de SQL, esto ha llevado a que este tipo de bases de datos estén ganando terreno dentro del mercado transaccional. Pero antes de ahondar en detalles necesitamos saber ¿Qué es un grafo?, un grafo es un conjunto de objetos denominados nodos (también son llamados vértices) unidos por enlaces llamados aristas, que para el contexto de BBDD nos permiten representar relaciones binarias. Los grafos tienen su propia teoría, matemáticamente muy amplia, en la que se tratan temas diversos como inserción de un nodo, métodos de búsqueda, eliminación, generación de la ruta más corta, etc. ![](media/image2.png) Figura 1. Ejemplo de grafo. Fuente: elaboración propia. La primera vez que se tiene registro del uso de los grafos fue en el año de 1736, en un artículo científico escrito por Leonhard Euler llamado *Los siete puentes de Königsberg*, en el cual Euler demuestra que cruzar los siete puentes de esta ciudad cruzando solo una vez por cada puente es imposible y lo hace mediante el diseño de un grafo. Aunque el termino grafo como tal, utilizado en un contexto matemático fue ideado por James Joseph Sylvester en 1878, desde ese momento en adelante la teoría se ha ido enriqueciendo a lo largo de los años y ha incursionado en distintas áreas del conocimiento como es en la electrónica de la mano de Kirchoff, con sus leyes de los circuitos hasta llegar a la época moderna, donde a partir de los años sesenta, la teoría de grafos ha desarrollado una fuerte relación con la computación y es que gracias a la capacidad de las computadoras se han podido resolver problemas planteados teóricamente. Actualmente esta relación con la computación ha logrado desarrollar y generar nuevas formas de usar los grafos. Mapa Descripción generada automáticamente Figura 2. Los siete puentes de Königsberg. Fuente: [[https://eltrasterodepalacio.files.wordpress.com/2011/11/plano-de-kc3b6nigsberg.jpg]](https://eltrasterodepalacio.files.wordpress.com/2011/11/plano-de-kc3b6nigsberg.jpg). Las aplicaciones modernas de grafos las podemos atestiguar en sistemas como Waze, que generan rutas de tráfico para sus usuarios, en el modelado de redes de computadora, incluso en áreas de estudios sociales para el estudio de influencias interpersonales y también en biología con el modelado de genes. Pero la aplicación que nos atañe en este momento es en bases de datos; con el auge de las redes sociales, la llegada de tecnologías como el internet de las cosas, las bases de datos orientadas a grafos han adquirido mayor popularidad y se vislumbra que el uso de las mismas solo irá al alza. []{#_Toc459888456.anchor}8.2. Bases de datos orientadas a grafos Un sistema de bases de datos orientados a grafos o para abreviar **bases de datos gráficas** es una base de datos en línea con operaciones de creación, lectura, actualización y borrado (CRUD) similar a otros sistemas de BBDD que ya hemos estudiado, pero con la principal diferencia que aquí se añade a las relaciones como un ente del mismo nivel que la información. Las bases de datos gráficas están pensadas y optimizadas para operar con transacciones, lo que las aleja de otros tipos de BBDD NoSQL porque sí se garantizan las cuatro **características ACID** (Atomicidad, Consistencia, Aislamiento y Durabilidad). Para comenzar a entender las bases de datos gráficas, es necesario entender sus dos propiedades macro: 1. 2. A continuación, se muestran algunos sistemas de bases de datos gráficas y cómo se clasifican según estas dos propiedades. ![Graph analytics with Stratio data-centric platform (Part 1)](media/image4.png) Figura 3. Bases de datos gráficas populares. Fuente: [[https://www.pinterest.com.mx/pin/409264684885726139/]](https://www.pinterest.com.mx/pin/409264684885726139/) Características principales El modelado de bases de datos usando grafos es relativamente nuevo y poco a poco ha ido ganando terreno como una alternativa fiable orientada de manera transaccional, no solo por ser NoSQL libre de esquema per se, sino también por tres características principales que han logrado atraer la atención de los desarrolladores: 1. 2. 3. []{#_Toc459888457.anchor} 8.3. Bases de datos orientadas a grafos contra SQL y NoSQL Actualmente podemos encontrar dos grupos de bases de datos; las bases de datos relacionales (que generalizaremos como SQL) y las bases de datos no relacionales (NoSQL). Dentro de las **BBDD NoSQL** podemos diferenciar otros subgrupos como las BBDD orientadas a documentos, las orientadas a clave-valor y las orientadas a grafos, aunque esta última puede entrar dentro otra categoría completamente diferente a las demás, ya que hace lo que ninguna otra: premia las relaciones y a diferencia de las NoSQL convencionales garantiza la consistencia de las transacciones sin sacrificar dinamismo. Vs. Las bases de datos relacionales A pesar de que su nombre lleva implícita las relaciones, este tipo de bases de datos no las manejan bien y cuantas más conexiones haya entre distintas tablas, la traducción al lenguaje de consulta se volverá más compleja al haber tantas operaciones JOIN anidadas; además, manejar múltiples llaves foráneas resulta confuso, a eso hay que añadir que para consultas recíprocas algunas se vuelven más costosas. Para comprender esto hay un ejemplo muy interesante en el libro *Graph Databases* de la serie O'Reilly en el que se muestra una consulta en una base de datos sencilla que modela a una persona con su lista de amigos en dos tablas (una para identificar la persona y otra para identificar sus amigos, tal como lo dictan las buenas prácticas de SQL), la consulta hace la siguiente pregunta: ¿quiénes son amigos de mis amigos?, implementar la consulta ya es bastante complejo pero también es altamente costoso computacionalmente porque necesita iterar varias veces entre las tablas para verificar una a una las relaciones, mientras que en las bases de datos gráficos solo necesitan iterar una vez por amigo eliminando costo computacional extra. Vs. NoSQL De igual forma que las bases de datos relacionales, las bases de datos NoSQL que no están orientadas a grafos batallan mucho con las relaciones entre sus elementos. Como solución se opta por usar agregaciones, pero requieren de un alto costo computacional, más que el usado en bases de datos relacionales, es fuerza bruta pura y dura para obtener resultados en este tipo de consultas. - **Ejemplo de estructura de una aplicación**. Las bases de datos orientadas a grafos pueden convivir con otros sistemas de bases de datos, que las alimenten de nueva información. En el siguiente gráfico podemos observar el ejemplo de una aplicación real donde el usuario solo convive con la aplicación y la aplicación usa los recursos desde una base de datos orientada a grafos, por tener beneficios en velocidad e integridad de la información, mientras que esta a su vez puede conectarse a otra base de datos que no necesariamente sea del mismo tipo. Como todo, las bases de datos orientadas a grafos tendrán pros y contras, dependerá del desarrollador identificar cuáles son los objetivos de su aplicación. Figura 4. Ejemplo de aplicación. Fuente: [[https://neo4j.com/graphacademy/training-overview-40/\_images/GraphDatabaseInEnterprise.png]](https://neo4j.com/graphacademy/training-overview-40/_images/GraphDatabaseInEnterprise.png). []{#_Toc507053630.anchor}8.4. Las relaciones y los grafos A diferencia de otros tipos de bases de datos, las bases de datos gráficos promueven y hacen uso intensivo y extensivo de las relaciones entre sus elementos. Este tipo de BBDD son modeladas a través de grafos, y aquí viene otra de sus ventajas, que el modelado que se planifique puede ser traspasado del papel a la implementación real tal cual es, así que existe menos tendencia al error y perdida de información al hacer la traducción. En la figura 5 podemos observar un ejemplo de un grafo para una base de datos. ![](media/image6.png) Figura 5. Ejemplo de base de datos gráfica, modelado del reenvío de un correo electrónico. Fuente: [[https://neo4j.com/blog/data-modeling-pitfalls/]](https://neo4j.com/blog/data-modeling-pitfalls/). Del ejemplo puede parecer que utilizar un grafo para modelar una actividad como el correo electrónico resulta excesiva (aunque no lo es), pero podrías imaginar el modelar la actividad de un usuario en una red social o a las personas que sigue..., es aquí donde es más fácil imaginar y aplicar el viejo refrán de «dime con quién andas y te diré quién eres», esto nos dará una aproximación real de la fortaleza de este tipo de almacenamiento y es que, gracias a las relaciones, podemos encontrar información relevante que para otro tipo de modelados pasaría desapercibida. Además, aunque el primer acercamiento a un grafo pareciera complejo de analizar, en realidad son **estructuras muy sencillas de analizar**; siguiendo un camino único de un nodo a otro es fácil entender e interpretar el diseño. Este tipo de bases de datos van de maravilla para sistemas de recomendación; también han sido aplicados para la detección de fraudes; como grafos de aprendizaje en inteligencia artificial, *Machine Learning*, *Chatbots*, manejo de capital humano y procesamiento de lenguaje natural; en redes computacionales para el control de vulnerabilidades, logística y análisis de impactos; por último pero no menos importante, se han utilizado como sistemas de administración de identidad en empresas para el manejo de credenciales de autenticación y aprovisionamiento. +-----------+-----------+-----------+-----------+-----------+-----------+ | Personali | Detección | Operacion | Manejo de | Procesami | Identific | | zación | de | es | datos. | ento | ación | | | fraude. | de red. | | de | y acceso | | | | | | grafos. | de | | | | | | | gerentes. | +===========+===========+===========+===========+===========+===========+ | Tareas en | Conocimie | Detección | Conocimie | Inteligen | Provision | | tiempo | nto | de | nto | cia | amiento. | | real, | del | vulnerabi | y | artificia | | | | consumido | lidades. | análisis | l, | Accesos y | | marketing | r, | | de los | | seguridad | | digital, | | Logística | datos. | *Machine | del | | | manejo de |. | | Learning* | personal. | | *Customer | cuentas, | | | , | | | Journey* | | | | | | | | relación | | | *Chatbots | | | C360. | de | | | ,* | | | | productos | | | | | | |. | | | procesami | | | | | | | ento | | | | | | | del | | | | | | | lenguaje | | | | | | | natural. | | +-----------+-----------+-----------+-----------+-----------+-----------+ Tabla 1. Aplicación de las BBDD orientadas a grafos. []{#_Toc179750163.anchor}8.5. Neo4j. Conceptos básicos Existen varios **sistemas de gestión de bases de datos orientadas a grafos**, pero de entre todas la que destaca por su popularidad es **Neo4j**. Neo4j es una plataforma que cuenta con un catálogo de herramientas completo para el desarrollo de proyectos profesionales, así como *plug-ins*, *drivers* y herramientas de integración y administración, de las cuales destacan: - **Neo4j Graph Database**: es el sistema base de Neo4j. Ejecuta todas las operaciones y funciona como servidor. - **Neo4j AuraDB**: es la implementación de Neo4j como servicio en la nube. Es de pago, con planes que se presupuestan según la cantidad de almacenamiento. - **Neo4j AuraDS**: similar a la anterior, pero orientada a Data Science. - **Neo4j Sandbox**: es otro servicio en la nube, enfocado en el aprendizaje y testeo. Las BBDD solo duran tres días con posibilidad de extender a siete. - **Neo4j Browser**: es una interfaz gráfica para visualizar gráficamente la base de datos y para probar consultas. - **Neo4j Desktop**: es una interfaz de usuario que se aloja localmente en nuestro ordenador, se puede utilizar para desarrollar proyectos y es multiplataforma. Los componentes principales de una base de datos gráfica en Neo4j son: 1. Nodo (vértices en terminología de grafos). 2. Relaciones (aristas en terminología de grafos). 3. Etiquetas. 4. Propiedades. Nodo Un nodo es una representación abstracta de un objeto u entidad, está asociado a dos datos: las etiquetas y las propiedades, pudiendo o no presentarlas, aunque por buena práctica al menos debe contener una etiqueta. - - Figura 6. Ejemplo de nodos en un grafo. Fuente: [[www.neo4j.com]](http://www.neo4j.com). Para ejemplificar, tomemos la figura 6, observemos que se trata de un grafo que conecta dos personas entre sí y con un coche. Sabemos que hay dos nodos de personas gracias a su etiqueta, que para este caso particular es *person* y entendemos que hay otro nodo que representa un coche por la etiqueta *car*. Los nodos *person* están descritos gracias a sus propiedades, que nos indican el nombre de cada uno y su fecha de nacimiento, los nodos no deben seguir una plantilla establecida por tipo, como podemos observar el nodo de la persona «Dan» tiene una propiedad extra donde se guarda su usuario en Twitter. Si bien los nodos son libres de agregar propiedades extra o quitar algunas de manera independiente al diseño general de la base de datos, también existe la posibilidad de asegurar información de algunas propiedades utilizando ***«asserts»*** lo cual se verá más adelante. Relaciones Las relaciones son una abstracción que sirven para representar dependencias entre los nodos. A diferencia de los nodos, que son laxos con sus etiquetas y propiedades al poder tenerlas o no, las relaciones obligatoriamente deben tener una dirección y especificar el tipo de relación. Una relación al ser considerada un ente de la misma categoría que un nodo, también puede o no tener propiedades que describan la relación. - - - ![](media/image8.png) Figura 7. Relaciones en un grafo. Fuente: [[www.neo4j.com]](http://www.neo4j.com). De la figura 7, se debe rescatar un punto extra; dos nodos pueden compartir múltiples relaciones entre sí, aunque no sean del mismo tipo, por ejemplo, aparte de que Dan y Ann se aman también sabemos que viven juntos. Rutas en un grafo Otro concepto importante, son las rutas en un grafo. Una ruta es una **secuencia finita de aristas y vértices que se recorren dentro de un grafo**. Existen tres definiciones importantes a la hora de recorrer un grafo a través de rutas. 1. **Paseo** (*walk*): es un recorrido ordenado a través de una secuencia de nodos, en donde los nodos y relaciones pueden usarse más de una vez. Figura 8. Paseo. Fuente [[www.neo4j.com]](http://www.neo4j.com). 2. **Sendero** (*trail*): es un paseo con la restricción de que no se puede usar una relación más de una vez, pero los nodos sí pueden ser visitados en más ocasiones. ![](media/image10.png) Figura 9. Trail. Fuente [[www.neo4j.com]](http://www.neo4j.com). 3. **Camino** (*path*): es un paseo donde los nodos solo pueden ser visitados una vez. Figura 10. Camino. Fuente [[www.neo4j.com]](http://www.neo4j.com). []{#_Toc179750164.anchor}8.6. Introducción a Cypher Neo4j, al ser orientado a grafos nativo en almacenamiento y procesamiento, desarrolló su propio lenguaje para administración de bases de datos, con el cual se pueden realizar todas las operaciones de creación, consulta, actualización y borrado, pero optimizado para trabajar con grafos. **Cypher** está pensado para ser amigable con los usuarios mientras se pase menos tiempo en codificar las consultas y más tiempo pensando en el modelado, es por eso por lo que introduce el uso de **ASCII art**, para entender de una mejor manera las consultas, ya que es muy parecido a leer en inglés. A continuación, repasaremos las **sintaxis básicas de Cypher** para la creación de relaciones y consultas básicas. Sintaxis de nodo Se usan paréntesis para indicar un nodo **()**, (n), para que, con algo de imaginación, podamos ver un círculo que encierra variables y etiquetas. Las variables dentro de un nodo como (n) representan nodos que serán procesados posteriormente por la consulta y que adquirirán un valor según se estipule en la consulta y así poder retornar y visualizar el dato o el conjunto de datos. Un nodo sin variable se trata de un **nodo anónimo**, esto nos sirve para cuando necesitamos retornar un valor de ese nodo. Como usar Cypher en Neo4j Neo4j cuenta con varios entornos para poder realizar y administrar proyectos de almacenamiento basados en grafos. - - Instalación de Neo4j Desktop **Neo4j desktop** te permitirá crear, administrar y lanzar la aplicación **web Neo4j Browser** que funciona como interfaz CRUD para proyectos de bases de datos basados en grafos. Para instalar la aplicación, puedes descargar el archivo de instalación en el siguiente enlace: [[https://neo4j.com/download/]](https://neo4j.com/download/). Tras acceder a la dirección de la página de descarga, se mostrará una pantalla similar a la siguiente: ![Interfaz de usuario gráfica, Texto, Aplicación Descripción generada automáticamente](media/image12.png) Figura 11. Descarga de Neo4j Deskop. Pulsaremos sobre el botón **Download**, lo que hará que se abra un formulario para introducir los datos del usuario. Interfaz de usuario gráfica, Texto, Aplicación Descripción generada automáticamente Figura 12. Formulario de datos de usuario de Neo4j Deskop. Una vez rellenos, pulsaremos el botón **Download Desktop** y comenzará la descarga, a la vez que se mostrará una ventana que contendrá la licencia, la cual deberemos copiar y pegar durante la instalación posterior. ![Imagen que contiene Interfaz de usuario gráfica Descripción generada automáticamente](media/image14.png) Figura 13. Licencia de usuario de Neo4j Deskop. Tras la instalación, nos mostrará una pantalla con la licencia, la cual deberemos aceptar pulsando el botón **I Agree**: Texto Descripción generada automáticamente Figura 13. Contrato de licencia de Neo4j Deskop. El siguiente paso consistirá en registrarse o pegar, en la parte de la derecha, la licencia que nos ha proporcionado la propia página web: ![Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente](media/image16.png) Figura 14. Activación de Neo4j Deskop. Pulsando el botón **Activate**, activaremos el producto y lo tendremos registrado con dicha licencia. Al terminar, se mostrará una interfaz como la siguiente: Interfaz de usuario gráfica, Aplicación, Teams Descripción generada automáticamente Figura 15. Interfaz de Neo4j Desktop. Gestión de bases de datos en Neo4j Desktop La principal función de esta es actuar como un entorno de administración de los proyectos, donde podremos crear nuevos, eliminar y agregar bases de datos, archivos y *plug-ins* creados por Neo4j o la comunidad. El primer paso será crear un proyecto, mediante el botón **New** y, dentro de este, la opción **Create Project**: ![Interfaz de usuario gráfica, Aplicación Descripción generada automáticamente](media/image18.png) Figura 15. Creación de un nuevo proyecto en Neo4j Desktop. El siguiente paso, será crear una base de datos. Para ello, pulsaremos el botón **Add** y, dentro de éste, la opción **Local DBMS**: Interfaz de usuario gráfica, Aplicación Descripción generada automáticamente Figura 16. Creación de una nueva base de datos en Neo4j Desktop. Será entonces cuando nos muestre una ventana donde introduciremos el nombre y la contraseña de la misma. Tras ello, pulsaremos el botón **Create**: ![Interfaz de usuario gráfica, Aplicación Descripción generada automáticamente](media/image20.png) Figura 17. Introducción de datos de base de datos en Neo4j Desktop. Acto seguido, deberemos arrancarla pulsando el botón **Start** ubicado a la derecha de la base de datos y esperaremos a que pase a estado activo (Active): Interfaz de usuario gráfica, Aplicación Descripción generada automáticamente con confianza media Figura 18. Base de datos arrancada en Neo4j Desktop. Una vez hecho, pulsaremos el botón **Open** y se abrirá, entonces, una ventana de Neo4j Browser con los datos de la misma: ![Interfaz de usuario gráfica, Texto, Aplicación Descripción generada automáticamente](media/image22.png) Figura 19. Neo4j Browser. Desde Neo4j browser, se pueden crear bases de datos desde cero, pero con el fin de entender el paradigma de las bases de datos orientadas a grafos y practicar algunas funciones básicas de Cypher, es interesante tener datos. Para ello podemos importar la base de datos ejemplo «Movie Database» que pertenece a Neo4j. Los pasos para realizarla son los siguientes: 1. Ir a la pestaña de favoritos, es la que tiene el símbolo de una estrella. Dentro de ella, seleccionaremos la opción Example Graphs y Movie Graph: Interfaz de usuario gráfica, Aplicación Descripción generada automáticamente Figura 20. Acceso a carga de la base de datos de películas. 2. Se agregará el código a la celda intérprete de Cypher. ![Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente](media/image24.png)Figura 21. Sintaxis de la base de datos ejemplo *Movie Graph*. 3. Cuando es una sola línea de código se puede ejecutar presionando **enter**, pero cuando son múltiples líneas se debe presionar el botón **Play** de la derecha. Deberemos navegar en el navegador interior para posicionarnos en la página 2 y, una vez ahí, pulsaremos el botón del **Play** pequeño: Texto, Carta Descripción generada automáticamente Figura 22. Código de creación de la base de datos Movie Graph. 4. Tras la ejecución del código, se cargará el grafo y quedará disponible para su análisis y visualización. ![Gráfico Descripción generada automáticamente](media/image26.png) Figura 23. Grafo de una base de datos en Neo4j. Conexión y uso de Neo4j Sandbox El **servicio de Sandbox** es más sencillo, ya que, al ser un servicio en la nube, no se necesita instalar nada y, además, es gratuito. La única desventaja es que las bases de datos creadas son efímeras y solo duran tres días, aunque se pueden ampliar hasta diez días. Para usar Sandbox solo es necesario registrarse en la página: [[https://sandbox.neo4j.com/login]](https://sandbox.neo4j.com/login). A la hora de identificarse o registrarse, existen diferentes opciones, tal y como podemos ver en la figura inferior. Interfaz de usuario gráfica Descripción generada automáticamente Figura 24. Creación de una cuenta en Neo4j. Una vez creada tu cuenta, se mostrará una página en la que deberemos aceptar las condiciones de licencia e introducir nuestros datos. Tras ello, podremos crear un proyecto. Pulsando el botón **New Project**, podremos hacerlo. Una vez pulsado, podremos seleccionar un proyecto existente, de entre los que ofrece Neo4j, o crear uno nuevo. ![Interfaz de usuario gráfica, Texto, Aplicación Descripción generada automáticamente](media/image28.png) Figura 25. Creación de un proyecto en Neo4j Sandbox. Seleccionando uno de los existentes, por ejemplo el de películas (Movies), y pulsando el botón **Create and Download Credentials** (ubicado en la parte inferior), comenzará el proceso de creación. Tras ello, se descargará un fichero de texto con las credenciales para acceder y se mostrará la pantalla con la base de datos creada y lista para arrancar. Interfaz de usuario gráfica, Aplicación, Teams Descripción generada automáticamente Figura 26. Base de datos de películas. Si pulsamos sobre la flecha del botón Open, podremos ver diferentes opciones o interfaces para abrirla: - - - - - Si abrimos el Browser obtendremos una nueva ventana web idéntica a la que se trabaja desde Neo4j Desktop, aunque previamente deberemos conectarnos con las credenciales que tenemos almacenadas en el fichero de texto. ![Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente](media/image30.png)Figura 27. Conexión a Neo4j Browser del Sandbox. Sintaxis de etiquetas Casi siempre, los nodos en una base de datos estarán etiquetados. Las **etiquetas** son usadas para **agrupar nodos** de una misma categoría, además que ayudan a optimizar el filtrado y las consultas. Como buena práctica las etiquetas son un sustantivo escrito con formato de **UpperCamelCase**. Un nodo puede tener más de una etiqueta. **Ejemplos**: (:Persona) (p:Persona) (c:Coche) (c:Coche:Deportivo) **Nota**. -- El código de siguientes páginas asume que se ha cargado la base de datos «Movie Database», ya sea en Neo4j Desktop o usando el servicio de Sandbox. Examinando el esquema general de la base de datos Antes de continuar hay que mencionar que las personas trabajando en Neo4j han pensado en todo y están muy interesados en que esta tecnología esté al alcance de todos. Es por eso por lo que han incluido una base de datos precargada acerca de películas, en su instalación Desktop y al correr su servicio Sandbox; este último es la forma más rápida y cómoda de acceder a un proyecto de base de datos gráfica para hacer pruebas o aprender. Cypher puede hacer uso de bibliotecas internas e instalar externas, las cuales son de gran ayuda para expandir las funciones de la base de datos. Mediante el comando CALL podemos hacer la llamada a un procedimiento en la base de datos, uno de los procedimientos básicos es CALL db.schema.visualization(). Diagrama Descripción generada automáticamenteFigura 28. Visualización del esquema de una base de datos en Neo4j. Se nos mostrará una aproximación al esquema general de la base de datos en forma de grafo, el cual podremos estudiar como mi primer acercamiento a una base de datos nueva. A continuación, analizaremos la base de datos «*Movie Database*». Antes de continuar con las consultas, la función que acabamos de probar, CALL db.schema.visualization(), nos ha mostrado el esquema general de los nodos y las relaciones en la base de datos. El esquema tiene las siguientes **entidades**: 1. ***Movie***: nodos que representan una película y sus propiedades son: - *Title*: el título de la película. - *Released*: el año en que fue estrenada en cines. - *Tagline*: una oración que representa el lema de la película. 2. ***Person***. Los nodos con esta etiqueta son una abstracción de una persona que en el contexto de películas pueden referirse a actores, directores, escritores, productores o críticos de cine. - *Name*: el nombre de la persona. - *Born*: el año de nacimiento. Las **relaciones** en el esquema funcionan como una forma de determinar el rol que cumplen las personas para las películas y hacia otros nodos persona: 1. ***ACTED\_IN***. Es la relación que sirve para identificar que un nodo persona actuó en una película, como propiedades cuenta con: - *Roles*: una lista de cadenas que puede tener uno o más elementos dependiendo si el actor tuvo más de un papel en la película. 2. ***DIRECTED***. Es la relación que sirve para identificar si una persona es director de una película. 3. ***PRODUCED***. Es la relación que sirve para identificar si una persona es productor de una película. 4. ***REVIEWED***. Es la relación que sirve para identificar si una persona hizo una reseña de una película y se puede identificar como un crítico. 5. ***WROTE***. Es una relación que determina si una persona escribió una película determinada. 6. ***FOLLOWS***. Esta es la única relación que no va de persona hacia película, sino de persona a persona, por lo que en el esquemático se expresa como un ***loop***. Determina si una persona sigue a otra en una red social. Sintaxis MATCH y RETURN Las cláusulas MATCH y RETURN son las dos más usadas en el lenguaje Cypher. Con las dos podemos hacer desde las consultas más simples hasta las más complejas. La cláusula MATCH hace un recorrido por toda la base de datos para encontrar todas las coincidencias de nodos y relaciones con la muestra proporcionada y después se utiliza la cláusula RETURN para devolver todos los valores encontrados. Puntos importantes a tener en cuenta como buena práctica: en Cypher, las cláusulas y palabras reservadas del lenguaje se escriben en mayúscula, de igual forma los tipos de relaciones se escriben en mayúsculas y la cláusula RETURN debe ser la última dentro de la consulta. **Ejemplos**: //Devuelve todos los nodos MATCH (n) RETURN n ![Gráfico, Gráfico de dispersión Descripción generada automáticamente](media/image32.png)Figura 29. Obtención de todos los nodos. // Devuelve todos los nodos con una RETURN etiqueta especifica MATCH (p:Person) RETURN p Gráfico, Gráfico de burbujas Descripción generada automáticamenteFigura 30. Obtención de nodos con etiqueta RETURN específica. Devolver nodos filtrando por el valor de una propiedad Se pueden hacer consultas y devolver nodos utilizando sus propiedades intrínsecas. **Sintaxis**: //Opción 1, usando un solo valor MATCH (variable {propiedad: valor}) RETURN variable //Opción 2, usando más de un valor MATCH(variable:Etiqueta{propiedad1:valor1,propiedad2: valor2}) RETURN variable **Ejemplos**: Usando solo una propiedad MATCH (p:Person {born: 1970}) RETURN p ![Gráfico, Gráfico de burbujas Descripción generada automáticamente](media/image34.png) Figura 31. Obtención de nodos usando una propiedad. Usando dos propiedades MATCH (m:Movie {released: 2003, tagline: \'Free your mind\'}) RETURN m Interfaz de usuario gráfica, Texto, Aplicación Descripción generada automáticamenteFigura 32. Obtención de nodos usando dos propiedades. Devolver propiedades de los nodos Cypher es versátil y esa versatilidad nos da la posibilidad de devolver valores de las propiedades y mostrarlas como una tabla; lo cual es lógico porque al devolver únicamente propiedades de los nodos ser pierde el concepto de nodo per se. **Sintaxis**: //Opción 1, usando una propiedad MATCH (variable {propiedad: valor1}) RETURN variable.prop2 //Opción 2, usando múltiples propiedades MATCH(variable:Etiqueta{propiedad1:valor1,propiedad2: valor2}) RETURN variable.prop3, variable.prop4 **Ejemplos**: Especificando el nombre de la cabecera en la tabla MATCH (p:Person {born: 1965}) RETURN p.name AS name, p.born AS \`Year of Birth\` ![Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente](media/image36.png) Figura 33. Resultados en Browser. []{#_Toc179750165.anchor}8.7. Consultas basadas en relaciones Hasta ahora todas las bases de datos manejaban sus consultas basadas en los elementos guardados y sus propiedades, Neo4j también hace lo mismo solo hay que tener presente que las relaciones también son elementos igual de relevantes que los nodos. Es por esto por lo que tenemos que cambiar de paradigma al realizar consultas en bases de datos gráficas y tomar en cuenta las relaciones para realizar mejor la consultas. Primeramente, resumamos las formas de **modelar las relaciones en Cypher**. - () // Un solo nodo. - ()\--() // Dos nodos tienen algún tipo de relación. - ()-\[\]-() // Dos nodos tienen un tipo de relación específico. - ()\--\>() // El primer nodo tiene una relación con el segundo. - ()\(m:Movie{title:\"The Matrix\"}) RETURN p,rel, m Esto nos devolverá un grafo con todos los nodos persona conectados a la película *The Matrix*. Gráfico Descripción generada automáticamente Figura 34. Grafo de los nodos conectados a la película. **Sintaxis general**: MATCH (node1)-\[:REL\_TYPE\]-\>(node2) RETURN node1, node2 Consultas usando el tipo de relación Como habíamos mencionado anteriormente, un nodo puede tener múltiples tipos de relaciones hacia un mismo nodo, por eso existen las consultas basadas en las relaciones. **Sintaxis**: MATCH (node1)-\[:REL\_TYPEA \| REL\_TYPEB\]-\>(node2) RETURN node1, node2 **Ejemplo**: MATCH(p:Person {name: \'Tom Hanks\'})-\[rel:ACTED\_IN\|DIRECTED\]-\> (m:Movie) RETURN type(rel), m.title En este ejemplo, obtenemos los resultados para una consulta basada en relaciones, donde se nos devuelve todas las películas donde aparece Tom Hanks como actor o como director. Esta consulta responde la pregunta ¿Cuáles son las películas en donde Tom Hanks actuó o dirigió? ![Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente](media/image38.png) Figura 35. Resultados de la búsqueda en la base de datos ejemplo. La **función *type*** retorna el tipo de relación que existe, observemos que hay una película donde Tom Hanks tiene el rol de director y en las demás el rol de actor. Podríamos hacer una consulta haciendo la pregunta, ¿Cuáles son las películas donde Tom Hanks participa?, esta consulta toma todas las relaciones que hay desde el nodo Tom Hanks hacia cualquier nodo película, independientemente del tipo de relación. MATCH (p:Person {name: \'Tom Hanks\'})-\[rel\]-\>(m:Movie) RETURN type(rel), m.title Figura 36. Resultados de la búsqueda en la base de datos ejemplo. Otra forma de hacer una consulta basada en relaciones es consultar solo un tipo de relación para responder a la pregunta ¿cuáles son las películas que Tom Hanks dirigió? MATCH (p:Person {name: \'Tom Hanks\'})-\[rel:DIRECTED\]-\>(m:Movie) RETURN type(rel), m.title ![Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente](media/image40.png) Figura 37. Resultados de la búsqueda en la base de datos ejemplo. Uso de nodos anónimos Se usan para no especificar una variable cuando no se necesita retornar valores de un nodo o cuando no se hará uso de este en otro momento de la consulta. La sintaxis es solo utilizar la etiqueta del nodo. **Ejemplo**: MATCH (p:Person)-\[:DIRECTED\]-\>(:Movie {title:\'Cloud Atlas\'}) RETURN p.name Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamenteFigura 38. Resultado de la búsqueda en la base de datos ejemplo. La consulta responde la pregunta ¿quiénes dirigieron la película *Cloud Atlas*?, en este caso solo necesitaremos mostrar los nombres de los directores, entonces no nos importa reportar el tipo de relación, tampoco el título de la película por lo que se usan de manera anónima es decir no se les asigna una variable. Uso de relaciones anónimas Se utilizan para indicar que existe una relación sin especificar el tipo de la relación. Supón que, para una película, dentro de la base de datos prueba en Neo4j, necesites conocer toda la gente que estuvo involucrada en su realización. Utilizamos una consulta para determinar todos los nodos persona que tengan relación con la película. **Ejemplo**: MATCH (p:Person)\--\>(m:Movie {title: \'The Matrix\'}) RETURN p, m ![Gráfico Descripción generada automáticamente con confianza baja](media/image42.png) Figura 39. Resultado de la búsqueda, nodos persona relacionados con la película. Se mostrarán todos los nodos que tengan una relación con el nodo de la película *The Matrix*. Las relaciones anónimas pueden ser representadas en estas formas. - \--\>: representa todas las relaciones con dirección nodo izquierdo a derecho. - \--: representa todas las relaciones en ambas direcciones. - \(:Movie {title:\'V for Vendetta\'}) RETURN p.name, type(rel) Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamenteFigura 40. Resultado de la búsqueda en la base de datos ejemplos. Filtrado usando propiedades de la relación Las propiedades de una relación también pueden ser utilizadas para filtrar consultas, similar a como se hace con los nodos. MATCH (p:Person)-\[:REVIEWED {rating: 65}\]-\>(:Movie {title: \'The Da Vinci Code\'}) RETURN p.name Para este ejemplo se utiliza el valor del *rating* para obtener solo los críticos que dieron un *rating* de 65. ![Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente](media/image44.png)Figura 41. Resultado de la búsqueda en la base de datos ejemplo. []{#_Toc179750166.anchor}8.8. Cuaderno de Ejercicios Usa **Neo4j Desktop** o **Neo4j Sandbox** para crear un proyecto con la base de datos de prueba precargada («**movie-Database**») que hemos estudiado en la teoría. - **Ejercicio 1**. Muestra el esquema general de la base de datos. **Respuesta**: CALL db.schema.visualization() Interfaz de usuario gráfica Descripción generada automáticamente con confianza baja El resultado que se muestra son dos nodos: uno de personas y otro de películas, con cinco relaciones entre ellos y una relación retroactiva para el nodo persona. - **Ejercicio 2**. Devuelve todos los nodos de con etiqueta persona. **Respuesta**: MATCH (p:Person) RETURN p ![Patrón de fondo Descripción generada automáticamente](media/image46.png) El resultado muestra los 133 nodos de tipo Person. - **Ejercicio 3**. Muestra solo las películas que fueron realizadas en el 2000. **Respuesta**:. MATCH (m:Movie{released:2000}) return m Interfaz de usuario gráfica Descripción generada automáticamente con confianza media Se muestran 3 nodos, correspondientes a las películas con título: Cast Away, The Replacements y Jerry Maguire. - **Ejercicio 4**. De la consulta anterior devuelve solo el título (*title*) y el eslogan (*tagline*) de la película. **Respuesta**: MATCH (m:Movie{released:2000}) return m.title, m.tagline ![Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente](media/image48.png) - **Ejercicio 5**. Muestra la tabla de la consulta anterior cambiando el encabezado de «*title*» por Título y «*tagline*» por Eslogan. **Respuesta**: MATCH (m:Movie{released:2000}) return m.title AS Título, m.tagline AS Eslogan Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente - **Ejercicio 6**. Devuelve el director de la película *The Matrix*. Se debe mostrar dos nodos uno por cada hermana Watchosky. **Pista: u**sa la relación «DIRECTED». **Respuesta**: MATCH (p:Person)-\[:DIRECTED\]-\>(:Movie{title: \"The Matrix\"}) RETURN p ![Imagen que contiene Gráfico de burbujas Descripción generada automáticamente](media/image50.png) - **Ejercicio 7**. En la película *The Matrix* devuelve el rol de la actriz Carrie-Anne Moss. **Respuesta**: MATCH (p:Person{name:\"Carrie-Anne Moss\"})-\[rel:ACTED\_IN\]-\>(m:Movie{title:\"The Matrix\"}) RETURN rel.roles Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente - **Ejercicio 8**. Devuelve el nombre de la persona que hizo el papel de «Morpheus» en *The Matrix*. **Pista: l**a propiedad roles es un arreglo de cadenas, usa \[ \] dentro de la relación ACTED\_IN para comparar con la propiedad «Roles». **Respuesta**: MATCH (p:Person)-\[:ACTED\_IN{roles:\[\"Morpheus\"\]}\]-\> (:Movie{title:\"The Matrix\"}) RETURN p ![Gráfico, Gráfico de burbujas Descripción generada automáticamente](media/image52.png) - **Ejercicio 9**. Devuelve todos los actores en la base de datos. **Respuesta**: MATCH (p:Person)-\[:ACTED\_IN\]-\>(:Movie) RETURN p Patrón de fondo, Gráfico de dispersión Descripción generada automáticamente El resultado muestra los 102 nodos de tipo Person que han actuado. - **Ejercicio 10**. Consulta todas las personas relacionadas con la película *Cloud Atlas*. **Respuesta**: MATCH (p:Person)\--(:Movie{title:\"Cloud Atlas\"}) RETURN p ![Imagen que contiene Gráfico Descripción generada automáticamente](media/image54.png) - **Ejercicio 11** (Extra). Consulta una película donde haya actuado Natalie Portman y haya sido dirigida por James Marshall. **Respuesta**: MATCH (:Person{name:\"Natalie Portman\"})-\[:ACTED\_IN\]-\>(m:Movie)\

Use Quizgecko on...
Browser
Browser