Datavin3

Importación de Datos Relacionales a Neo4j usando Apache Hop - Neo4j Output

Escrito por Adalennis Buchillón Soris | 19 de febrero de 2024 15:45:00 Z

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

El modelo de datos relacional primero debe convertirse en un modelo de datos de grafo. Al construir un modelo de grafo a partir de un modelo relacional, hay algunas pautas estándar que seguir.
 
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

La ejecución del pipeline crea 200 nodos Actor en la base de datos de grafo dvdrental.
 
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 

La ejecución del pipeline crea 16 nodos Language en la base de datos de grafo dvdrental.

Pipeline write_languages.hpl

Puedes ver algunos de los nodos en la base de datos ejecutando este código:

Cypher

MATCH (n:Language) RETURN n;
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
Puedes ver algunas de las relaciones en la base de datos ejecutando este código:
 

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;