Luchando contra el crimen haciendo RAG con Neo4j, langchain4j y OpenAI

Integración de Neo4j, LangChain4j y OpenAI para crear un asistente que usa RAG en la investigación criminal, mejorando el análisis de datos y relaciones.
Vehículo de policía metropolitana patrullando una calle iluminada por la noche

Hace muchos años leí en algún sitio que el SQL se pensó para que lo pudiera entender cualquiera, con el objetivo de que las personas no técnicas pudieran recuperar la información. Alguno seguro que ya se le ha escapado una sonrisilla irónica al leer esto, pero así fue. Lo curioso es que lo que parecía una broma, con la aparición de los modelos de lenguaje, empieza a ser cierto. Ahora, los modelos de lenguaje nos permiten interactuar con las bases de datos de una forma natural, haciendo de intérpretes entre nosotros y las bases de datos y esto es básicamente parte de lo que hay que hacer en el proceso de RAG (Retrieval Augmented Generation).

En este anterior tutorial ya nos introdujimos en todo esto de la mano de una base de datos vectorial como Chroma y cómo podemos usarlas para almacenar y recuperar información de forma eficiente a la hora añadir contexto cuando interactuamos con un LLM y ya esto estaba ocurriendo, pero gracias al trabajo de langchain y a que la búsqueda en una base de datos vectorial es también semántica, esto puede pasar desapercibido. y a que la búsqueda en una base de datos vectorial es también semántica, esto puede pasar desapercibido.

Sin embargo, en este nuevo tutorial vamos a ver cómo también podemos usar Neo4j, una base de datos de grafos, para hacer RAG y recuperar información a la hora añadir contexto cuando interactuamos con un LLM, y cómo al igual que existe el SQL para las bases de datos relacionales, existe el lenguaje Cypher para las bases de datos de grafos.

Este tutorial no es de Neo4j, por lo que no me detendré en ella, pero aquí os dejo unos cuantos enlaces interesantes:

Ya sin más preámbulos vayamos al grano.

Índice

  1. Entorno
  2. El ejemplo
  3. Conclusiones

1. Entorno

El tutorial está escrito usando el siguiente entorno: – Hardware: Portátil MacBook Pro 15″ (Intel Core i9, 32GB, 1TB SSD).

  • IntelliJ IDEA (2024.2.4)
  • Sistema Operativo: macOS Sonoma 14.7

2. El ejemplo

Antes de nada, os dejo todo el código fuente de este tutorial en este repositorio de GitHub.

Para empezar vamos a necesitar tener instalado Neo4j. Podemos hacerlo de varias formas, podéis usar Docker, usar Aura o el Desktop de Neo4j. Para este tutorial os recomiendo esta última opción que será más fácil para luego importar la base de datos que usaremos en el ejemplo.

En el ejemplo hemos creado un asistente virtual que tratará de ayudarnos en nuestra lucha contra el crimen y la prevención de personas vulnerables en la ciudad de Manchester.
Para ello, usaremos esta base de datos ya creada con información criminal inventada en dicha ciudad.

Hasta aquí ya deberíais tener instalado Neo4j Desktop instalado y la base de datos de ejemplo cargada si habéis seguido la información del enlace anterior.
Si abrimos el Neo4j Browser y ejecutamos la siguiente consulta (sería algo las personas que tienen alguna relación con algún crimen):

Text
    A continuación muestro la respuesta a la pregunta: Find a list of crimes that has participated Amy Bailey (NHS No: 276-19-9235) order by most recent first

Assistant: AI-> Here is the list of crimes that Amy Bailey has participated in, ordered by the most recent first:

1. **Crime ID:** e35c34d58fa35f2110b059882a34703d132552a4ad408eac3f82f15aeb165f0f
   **Date:** 22/08/2017
   **Type:** Vehicle crime
   **Last Outcome:** Investigation complete; no suspect identified

2. **Crime ID:** ab71bb05a5b0620dfec3779eead19d2c121cb73ee58e51cc7306d0dc5ff471c0
   **Date:** 1/08/2017
   **Type:** Vehicle crime
   **Last Outcome:** Investigation complete; no suspect identified

veremos que hay información en la base de datos:

Visualización de grafo de personas y delitos en Neo4j
Diagrama de grafo en Neo4j mostrando conexiones entre personas y delitos utilizando la relación PARTY_TO.

Si habéis leído el enlace acerca de RAG que os he dejado al principio, habréis visto cómo deberíamos hacer las cosas, pero tranquilos, que esto ya lo han hecho por nosotros los amigos de langchain4j (hoy toca Java).
Tampoco nos vamos a centrar en langchain4j, pero aquí os dejo algunos tutoriales anteriores:

Hemos definido, lo primero la interfaz de nuestro asistente y el prompt de sistema:

Text
    A continuación muestro la respuesta a la pregunta: Can you find what police officers investigated the crime e35c34d58fa35f2110b059882a34703d132552a4ad408eac3f82f15aeb165f0f

Assistant: AI-> The police officer who investigated the crime with ID **e35c34d58fa35f2110b059882a34703d132552a4ad408eac3f82f15aeb165f0f** is:

- **Name:** Ray Farrin
- **Badge Number:** 20-9326770
- **Rank:** Police Constable

If you need any more information or assistance, just let me know!

Ahora mostremos la configuración:

::CODECOLORER_BLOCK_9::

Todo es bastante evidente: – El ContentRetriever es el que se encarga de recuperar la información de la base de datos de Neo4j (y traducirá a Cypher entre otras cosas)

  • El ChatMemory es el que se encarga de recordar las conversaciones anteriores.
  • El ChatLanguageModel quién interactuará con OpenAI (recordad, tenéis que configurar una API Key).

Y por último, el código del asistente:

::CODECOLORER_BLOCK_10::

Sí, prácticamente eso es todo. Ahora, ejecutemos la aplicación (revisad el fichero application.properties) y veamos cómo funciona todo esto:

Preguntemos por niños en situación de riesgo a ver qué pasa:

::CODECOLORER_BLOCK_11::

Vamos a pedirle que nos dé información acerca de los criminales que tienen cierta relación con Kimberly:

::CODECOLORER_BLOCK_12::

Ahora, vamos a tirar del hilo de Amy Bailey:

::CODECOLORER_BLOCK_13::

Ahora, vamos a ver si puedo encontrar a algún agente que haya investigado algún crimen en el que esté envuelta Amy Bailey para contactar con él:

::CODECOLORER_BLOCK_14::

Podríamos ya ponernos en contacto con Ray Farrin para ver si nos puede dar más información acerca de Amy Bailey y el riesgo que supone su relación con Kimberly. Creo que con esto se entiende la idea.

Os invito a que reviséis las trazas que langchain4j nos proporciona para ver cómo se ha ido interactuando con Neo4j y OpenAI para ver que no es magia.

3. Conclusiones

No está mal la verdad. Con bastante poco código hemos conseguido un asistente virtual que nos puede ayudar a investigar y prevenir crímenes como si fuésemos el CSI. Y todo esto gracias a la base de datos de Neo4j, langchain4j y un poco de Java.
Obviamente, para hacer algo "profesional" hay que tener en cuenta muchas más cosas, sobre todo teniendo en cuenta lo serio del tema que estamos tratando, pero es muy interesante comprobar como los modelos de lenguaje van a cambiar la forma en la que nos relacionamos con las fuentes de información.
Espero que os haya gustado.

Stay tuned!

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Consultor tecnológico de desarrollo de proyectos informáticos.  Ingeniero Técnico en Telecomunicaciones. Puedes encontrarme en Autentia by Izertis

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

30/10/2025

Benjamín Suárez Menéndez

El Complex Problem Solving (CPS) es un proceso estructurado basado en herramientas, técnicas y actitudes que nos facilita la resolución de problemas complejos.

03/10/2025

Miguel García Rodríguez

Descubre cómo el diseño y la psicología del comportamiento utilizan sesgos cognitivos para influir en la toma de decisiones de los usuarios y potenciar la persuasión.

30/09/2025

Iván García Sainz-Aja

En este artículo exploraremos cómo utilizar ZenWave360 para generar un proyecto completo de Spring Boot con Kotlin a partir de un modelo DSL de Lenguaje Ubicuo.