Importa datos relacionales en Neo4j utilizando Apache Hop con nuestra guía dedicada de Salida a Neo4j. Mejora tu proceso de integración de datos paso a paso.
Introducción
Hola, este es un post de cómo hacerlo y vamos a explicar cómo importar datos relacionales en una base de datos de Neo4j utilizando Apache Hop.
Si estás aquí, supongo que ya conoces Neo4j y Apache Hopp, digamos que tener una comprensión básica del modelo de grafo de propiedades es el único requisito para completar la tarea.
La idea es exportar datos de un sistema de base de datos relacional (utilizaremos PostgreSQL en este caso) e importar los datos en una base de datos Neo4j (base de datos de grafo) utilizando la transformación de salida de Neo4j (Neo4j Output).
Puedes encontrar el código y los archivos en el repositorio público how-to-apache-hop.
Podemos dividir la tarea en pequeñas partes:
También puedes consultar nuestra publicación Apache Hop: Importando datos relacionales a Neo4j con Apache Hop - Graph Output, que es similar, pero en ese caso solo cargamos los nodos con al menos una relación y utilizamos otro plugin de Apache Hop: Neo4j Graph Output.
Vamos a utilizar una base de datos de muestra PostgreSQL. La base de datos dvdrental representa los procesos comerciales de una tienda de alquiler de DVD, incluidos datos sobre las películas, actores y datos demográficos del personal.
Modelo de base de datos dvdrental |
🗒 Para mantener el grafo más pequeño, simplemente elegimos algunas de las entidades que son más relevantes para nuestro grafo y probablemente se beneficiarían más al comprender las relaciones en nuestro ejemplo.
|
Fragmento del modelo dvdrental |
Convert relational model to graph model |
Basándonos en esto, convertimos nuestro modelo relacional en un modelo de grafo.
Nodos y Etiquetas
Cada fila de nuestra tabla de Actor se convierte en un nodo en nuestro grafo con Actor como etiqueta.
Cada fila de nuestra tabla de Film se convierte en un nodo con Film como etiqueta.
Cada fila de nuestra tabla de Category se convierte en un nodo con Category como etiqueta.
Cada fila de nuestra tabla de Language se convierte en un nodo con Language como etiqueta.
Relaciones
La unión entre Actor y Film se convierte en una relación llamada ACTS_IN.
La unión entre Film y Category se convierte en una relación llamada BELONGS_TO.
La unión entre Film y Language se convierte en una relación llamada IN.
Si dibujamos nuestra traducción en una pizarra, tendremos este modelo de datos de grafo.
|
Esquema de base de datos grafo dvdrental |
Puedes realizar la extracción y carga con Apache Hop implementando varios pipelines y flujos de trabajo:
ETL implementation |
Nodos Film
Los datos de los nodos ahora se pueden importar en la base de datos Neo4j. Utilizando una entrada de tabla y una transformación de salida de Neo4j (Neo4j Output), empleamos un pipeline de Hop para cargar las películas:
Pipeline write_films.hpl |
Utilizando una conexión PostgreSQL y la transformación de entrada de tabla, recuperamos los datos de la tabla film:
Consulta SQL
SELECT *
FROM public.film
Table input transform |
La transformación de salida de Neo4j (Neo4j Output) te permite cargar los datos de las películas en la base de datos dvdrental de Neo4j, mapeando los campos de la tabla como propiedades de nodo.
Neo4j Output transform - From Node tab |
La etiqueta es Film y las propiedades son los campos extraídos en la transformación anterior.
🗒 No es necesario importar todas las columnas de la tabla. Determina qué características de nodo son necesarias, cuáles se pueden omitir y cuáles deben importarse en otro tipo de nodo o relación.
La ejecución del pipeline crea 1000 nodos film en la base de datos de grafo dvdrental.
Pipeline write_films.hpl |
Puedes ver algunos de los nodos en la base de datos ejecutando este código:
Cypher
MATCH (n:Film) RETURN n LIMIT 10;
Nodos Film |
Al igual que el anterior, crea un pipeline para los otros 3 tipos de nodos.
Nodos Actor
Pipeline write_actors.hpl |
Puedes ver algunos de los nodos en la base de datos ejecutando este código:
Cypher
MATCH (n:Actor) RETURN n LIMIT 10;
Actor nodes |
Nodos Category
La ejecución del pipeline crea 16 nodos Category en la base de datos de grafo dvdrental.
Pipeline write_categories.hpl |
Puedes ver algunos de los nodos en la base de datos ejecutando este código:
Cypher
MATCH (n:Category) RETURN n LIMIT 10;
Category nodes |
Language nodes
Language nodes |
You may now create the relationships between the nodes after you have loaded all of the nodes and indexes. Ahora puedes crear las relaciones entre los nodos después de haber cargado todos los nodos e índices.
Relaciones ACTS_IN
Los datos de las relaciones ahora pueden ser importados en la base de datos Neo4j. Usando una entrada de tabla (Table Input) y una transformación de salida de Neo4j (Neo4j Output), construimos un pipeline de Apache Hop para cargar las relaciones ACTS_IN:
Pipeline to write relationships |
Utilizando una conexión PostgreSQL y la transformación de entrada de tabla (Table Input), recuperamos los datos de la tabla film_actor. En este caso, solo necesitas obtener los datos de la tabla film_actor que almacena la relación de muchos a muchos entre film y actor.
Table film_actor |
SQL query
SELECT *
FROM public.film_actor
Table input transform |
La transformación de salida de Neo4j te permite cargar los datos de ACTS_IN en la base de datos dvdrental de Neo4j mapeando los campos de la tabla como propiedades de nodo.
Neo4j Output transform |
A continuación, tenemos 3 pestañas:
Pestaña From Node
Neo4j Output transform - From Node tab |
Pestaña To Node
Neo4j Output transform - To Node tab |
Pestaña Relationship
Neo4j Output transform - Relationship tab |
La ejecución del pipeline crea 5462 relaciones ACTS_IN en la base de datos de grafo dvdrental.
Pipeline write_acts_in.hpl |
Puedes ver algunas de las relaciones en la base de datos ejecutando este código:
Cypher
MATCH (a:Actor)-[]-(f:Film) RETURN a,f LIMIT 10;
ACTS_IN relationships |
Similar al anterior, crea un pipeline para los otros 2 tipos de relaciones.
Relaciones BELONGS_TO
La ejecución del pipeline crea 1000 relaciones BELONGS_TO en la base de datos de grafo dvdrental.
Pipeline write_belongs_to.hpl |
Cypher
MATCH (f:Film)-[]-(c:Category) RETURN f,c LIMIT 10;
BELONGS_TO relationships |
Relaciones IN
La ejecución del pipeline crea 1000 relaciones IN en la base de datos de grafo dvdrental.
Pipeline write_in.hpl |
Puedes ver algunas de las relaciones en la base de datos ejecutando este código:
Cypher
MATCH (f:Film)-[]-(l:Language) RETURN f,l LIMIT 10;
IN relationships |
Pero no queremos ejecutar los pipelines uno por uno cada vez que necesitemos cargar los datos después de una actualización o un error, por lo que implementamos una orquestación de flujos de trabajo.
Flujo de trabajo para los pipelines de carga de nodos
Primero, implementamos un flujo de trabajo para ejecutar todos los pipelines de los nodos. Cree un nuevo flujo de trabajo y agregue una acción de Pipeline (Pipeline action) para cada pipeline de nodo y configúrelos de la siguiente manera:
Pipeline action |
Busca el archivo del pipeline y el nombre del archivo se agregará al Nombre de la Acción (Action Name).
Flujo de trabajo para los pipelines de carga de relaciones
Luego, implementamos un flujo de trabajo para ejecutar todos los pipelines de las relaciones. Crea un nuevo flujo de trabajo y añade una acción de Pipeline para cada pipeline de relación y configúralos buscando el archivo del pipeline.
Por último, creamos un flujo de trabajo principal para ejecutar los dos flujos de trabajo anteriores al mismo tiempo. En este caso, utilizamos acciones de Flujo de trabajo (Workflow actions) pero la configuración es similar. Simplemente agrega una acción para cada flujo de trabajo a ejecutar y busca el archivo del pipeline; el nombre del archivo se agregará al Nombre de la acción (Action Name).
Si tu flujo de trabajo principal se ejecuta correctamente, obtendrás una base de datos grafo que contiene tus datos de dvdrental.
¡Vamos a explorar la base de datos de grafo que acabas de cargar!
Corre el siguiente código Cypher para ver el esquema:
Cypher
CALL db.schema.visualization;
Entonces, si ejecutas el siguiente bloque de código para recopilar 15 nodos del gráfico, podrás observar las relaciones distintas:
MATCH (n) RETURN n LIMIT 15;