Facilitate la exportación de datos desde Neo4j utilizando Apache Hop, aprovechando Neo4j Cypher e...
Importación de Datos Relacionales a Neo4j usando Apache Hop - Neo4j Output
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:
- Primero, necesitamos traducir el esquema relacional a un modelo de grafo.
- Implementar los pipelines para cargar los datos de los nodos.
- Implementar los pipelines para cargar los datos de las relaciones.
- Finalmente, implementamos los flujos de trabajo para orquestar la ejecución de los pipelines.
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.
La base de datos relacional
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 |
Paso 1: Define el modelo de grafo
![]() |
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:
- Un pipeline por etiqueta de nodo:
- Actor
- Film
- Category
- Language
- Un pipeline por relación:
- ACTS_IN
- BELONGS_TO
- IN
- Un flujo de trabajo para orquestar la ejecución de los pipelines para cargar los nodos.
- Un flujo de trabajo para orquestar la ejecución de los pipelines para cargar las relaciones.
- Un flujo de trabajo para orquestar la ejecución de los dos flujos de trabajo anteriores.
![]() |
ETL implementation |
Paso 2: Implementa los pipelines para cargar los datos de los nodos
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 |
- Nombre de la transformación: establece el nombre de esta transformación en el pipeline (write-films).
- Conexión de Neo4j: selecciona la conexión de Neo4j para escribir el grafo (neo4j-connection).
- Tamaño del lote: la transformación agregará 1000 registros en una transacción única para obtener un mejor rendimiento.
- Crear índices: selecciona esta opción para generar restricciones de campo únicas para todos los atributos primarios en los nodos.
- Usar CREAR en lugar de FUSIÓN: selecciona esta opción para omitir cualquier búsqueda y cargar los datos de manera más rápida.
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 |
Paso 3: Implementa los pipelines para cargar los datos de las relaciones
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 |
- Nombre de la transformación: write-acts-in, el nombre de esta transformación en el pipeline.
- Conexión Neo4j: neo4j-connection, selecciona la conexión Neo4j para escribir el grafo.
- Tamaño de lote: la transformación agregará 1000 registros en una sola transacción para un mejor rendimiento.
- Crear solo relaciones: selecciona esta opción porque vamos a crear solo relaciones en este caso.
A continuación, tenemos 3 pestañas:
- Desde el nodo: para especificar el nodo desde el cual comienza la relación (Actor).
- Hacia el nodo: para especificar el nodo de destino de la relación (Film).
- Relación: para especificar los datos de la relación (ACTS_IN).
Pestaña From Node
![]() |
Neo4j Output transform - From Node tab |
- La etiqueta es Actor y la propiedad para crear la relación es actor_id.
- Los campos de propiedad desde el nodo son actor_id, extraídos de la tabla film_actor en la transformación anterior.
- El nombre de la propiedad que especificamos es el nombre de la propiedad que usamos para crear el nodo.
Pestaña To Node
![]() |
Neo4j Output transform - To Node tab |
- La etiqueta es Film y la propiedad para crear la relación es film_id.
- Los campos de propiedad desde el nodo son actor_id, extraídos de la tabla film_actor en la transformación anterior.
- El nombre de la propiedad que especificamos es el nombre de la propiedad que usamos para crear el nodo.
Pestaña Relationship
![]() |
Neo4j Output transform - Relationship tab |
- El valor de la relación es ACTS_IN.
- En los campos de propiedades de la relación, especificamos el campo last_update extraído de la tabla film_actor en la transformación anterior.
- En el nombre de la propiedad de la relación, especificamos el nombre de la propiedad de la relación.
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.
Paso 4: Implementa los flujos de trabajo para correr los pipelines
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).
El grafo de conocimiento dvdrental
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;