Neo4j es una base de datos de grafos: guarda la información como nodos y relaciones, lo que hace muy rápidas las consultas que recorren conexiones, como recomendaciones, detección de fraude, redes sociales o dependencias entre servicios. Se consulta con Cypher, un lenguaje declarativo basado en patrones. En este tutorial instalarás Neo4j Community Edition en Ubuntu 24.04 desde el repositorio oficial, ajustarás su memoria, crearás un pequeño grafo con Cypher, activarás la biblioteca APOC y harás una copia de seguridad con neo4j-admin.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Al menos 2 GB de RAM (4 GB o más si el grafo va a crecer).
  • Un cliente SSH en tu equipo para acceder a Neo4j Browser mediante un túnel.

Paso 1: Instalar Java 21

Las versiones actuales de Neo4j (serie 2025 y posteriores, con numeración por calendario) necesitan Java 21. Instálalo desde los repositorios de Ubuntu:

sudo apt update
sudo apt install -y openjdk-21-jre-headless

Comprueba la versión:

java -version
openjdk version "21.0.8" 2025-07-15
OpenJDK Runtime Environment (build 21.0.8+9-Ubuntu-0ubuntu124.04.1)
OpenJDK 64-Bit Server VM (build 21.0.8+9-Ubuntu-0ubuntu124.04.1, mixed mode, sharing)

Paso 2: Añadir el repositorio de Neo4j e instalarlo

Descarga la clave de firma de Neo4j en /etc/apt/keyrings y añade el repositorio estable:

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/neotechnology.gpg
echo "deb [signed-by=/etc/apt/keyrings/neotechnology.gpg] https://debian.neo4j.com stable latest" | sudo tee /etc/apt/sources.list.d/neo4j.list

Instala Neo4j Community Edition, que incluye también cypher-shell:

sudo apt update
sudo apt install -y neo4j

Durante la instalación puede aparecer una pantalla con la licencia; acéptala para continuar. Comprueba la versión instalada:

neo4j --version
2025.08.0

Paso 3: Definir la contraseña inicial

Neo4j crea un usuario neo4j. Establece su contraseña antes del primer arranque, así no queda la contraseña por defecto en ningún momento. Sustituye your_strong_password (mínimo 8 caracteres):

sudo -u neo4j neo4j-admin dbms set-initial-password 'your_strong_password'
Changed password for user 'neo4j'. IMPORTANT: this change will only take effect if performed before the database is started for the first time.

Paso 4: Ajustar la memoria

Neo4j usa dos zonas de memoria: el heap de Java, para ejecutar consultas, y la page cache, donde mantiene en RAM los archivos del grafo. Si no las fijas, las calcula al arrancar y pueden variar. Pide a neo4j-admin una recomendación para la RAM de tu servidor:

sudo -u neo4j neo4j-admin server memory-recommendation

La salida termina con líneas como estas (el ejemplo es para un servidor de 4 GB):

server.memory.heap.initial_size=1g
server.memory.heap.max_size=1g
server.memory.pagecache.size=1g

Abre la configuración principal:

sudo nano /etc/neo4j/neo4j.conf

Busca esas tres claves (vienen comentadas con #), descoméntalas y pon los valores recomendados:

server.memory.heap.initial_size=1g
server.memory.heap.max_size=1g
server.memory.pagecache.size=1g

Deja server.default_listen_address comentado. Así Neo4j solo escucha en localhost y no queda expuesto a Internet; accederás a él con un túnel SSH.

Paso 5: Arrancar Neo4j

Habilita y arranca el servicio:

sudo systemctl enable --now neo4j

Comprueba el estado y espera a ver en el log que está listo:

sudo journalctl -u neo4j -n 20 --no-pager
... INFO  Bolt enabled on localhost:7687.
... INFO  HTTP enabled on localhost:7474.
... INFO  Remote interface available at http://localhost:7474/
... INFO  Started.

Neo4j escucha en dos puertos: 7687 para Bolt, el protocolo binario que usan los drivers y cypher-shell, y 7474 para HTTP y Neo4j Browser.

Conéctate con cypher-shell:

cypher-shell -u neo4j

Introduce la contraseña del paso 3 y lanza una consulta de prueba:

SHOW DATABASES YIELD name, currentStatus;
+-----------------------------+
| name     | currentStatus    |
+-----------------------------+
| "neo4j"  | "online"         |
| "system" | "online"         |
+-----------------------------+

La edición Community tiene una única base de datos de usuario, neo4j, además de system, que guarda usuarios y configuración. Crear bases de datos adicionales requiere la edición Enterprise.

Paso 6: Crear restricciones e índices

Antes de cargar datos, define qué propiedades identifican cada tipo de nodo. Una restricción de unicidad impide duplicados y crea un índice automáticamente, lo que acelera las búsquedas por esa propiedad. En cypher-shell:

CREATE CONSTRAINT person_email IF NOT EXISTS
FOR (p:Person) REQUIRE p.email IS UNIQUE;

CREATE CONSTRAINT company_name IF NOT EXISTS
FOR (c:Company) REQUIRE c.name IS UNIQUE;

CREATE INDEX person_name IF NOT EXISTS
FOR (p:Person) ON (p.name);

Comprueba que se han creado:

SHOW INDEXES YIELD name, type, labelsOrTypes, properties, state;

Los tres deben aparecer con state igual a "ONLINE".

Paso 7: Crear y consultar un grafo con Cypher

En Cypher, los nodos se escriben entre paréntesis y las relaciones entre corchetes con una flecha: (a:Person)-[:WORKS_AT]->(c:Company). MERGE crea el patrón solo si no existe, así que puedes repetir la carga sin duplicar datos:

MERGE (ana:Person {email: '[email protected]'}) SET ana.name = 'Ana'
MERGE (luis:Person {email: '[email protected]'}) SET luis.name = 'Luis'
MERGE (marta:Person {email: '[email protected]'}) SET marta.name = 'Marta'
MERGE (pablo:Person {email: '[email protected]'}) SET pablo.name = 'Pablo'
MERGE (acme:Company {name: 'Acme'})
MERGE (globex:Company {name: 'Globex'})
MERGE (ana)-[:WORKS_AT {since: 2021}]->(acme)
MERGE (luis)-[:WORKS_AT {since: 2023}]->(acme)
MERGE (marta)-[:WORKS_AT {since: 2020}]->(globex)
MERGE (ana)-[:KNOWS]->(marta)
MERGE (marta)-[:KNOWS]->(pablo);
0 rows
ready to start consuming query after 45 ms, results consumed after another 0 ms
Added 6 nodes, Set 13 properties, Created 5 relationships, Added 6 labels

Consulta quién trabaja en Acme:

MATCH (p:Person)-[r:WORKS_AT]->(c:Company {name: 'Acme'})
RETURN p.name AS persona, r.since AS desde
ORDER BY desde;
+----------------+
| persona | desde |
+----------------+
| "Ana"   | 2021  |
| "Luis"  | 2023  |
+----------------+

La ventaja de un grafo aparece al recorrer varios saltos. Esta consulta busca personas a las que Ana podría conocer a través de sus contactos (amigos de amigos a los que aún no conoce):

MATCH (ana:Person {name: 'Ana'})-[:KNOWS]->(:Person)-[:KNOWS]->(sugerencia:Person)
WHERE NOT (ana)-[:KNOWS]->(sugerencia) AND sugerencia <> ana
RETURN DISTINCT sugerencia.name AS sugerencia;
+------------+
| sugerencia |
+------------+
| "Pablo"    |
+------------+

Y el camino más corto entre dos personas por cualquier tipo de relación:

MATCH path = shortestPath((a:Person {name: 'Luis'})-[*..6]-(b:Person {name: 'Pablo'}))
RETURN [n IN nodes(path) | coalesce(n.name, n.email)] AS camino;
+-----------------------------------------+
| camino                                  |
+-----------------------------------------+
| ["Luis", "Acme", "Ana", "Marta", "Pablo"] |
+-----------------------------------------+

Antepón PROFILE a cualquier consulta para ver su plan de ejecución y comprobar que usa los índices (operadores NodeIndexSeek o NodeUniqueIndexSeek en lugar de NodeByLabelScan). Sal de cypher-shell con :exit.

Paso 8: Acceder a Neo4j Browser por túnel SSH

Neo4j Browser es la interfaz web para escribir consultas y ver el grafo dibujado. Como Neo4j solo escucha en localhost, abre un túnel SSH desde tu equipo que reenvíe ambos puertos. Sustituye your_user y your_server_ip:

ssh -L 7474:localhost:7474 -L 7687:localhost:7687 your_user@your_server_ip

Con la sesión abierta, entra en http://localhost:7474 en tu navegador, elige la URL de conexión neo4j://localhost:7687 e inicia sesión con neo4j y tu contraseña. Ejecuta MATCH (n) RETURN n para ver el grafo que has creado.

Paso 9: Activar APOC Core

APOC es la biblioteca de procedimientos más utilizada de Neo4j: importación de JSON y CSV, utilidades de texto y fechas, refactorización del grafo y más. El paquete incluye APOC Core en el directorio labs; para activarlo, cópialo a plugins:

ls /var/lib/neo4j/labs/
sudo cp /var/lib/neo4j/labs/apoc-*-core.jar /var/lib/neo4j/plugins/
sudo chown neo4j:neo4j /var/lib/neo4j/plugins/apoc-*-core.jar
sudo systemctl restart neo4j

Verifica que se ha cargado:

cypher-shell -u neo4j "RETURN apoc.version() AS apoc;"
+-------------+
| apoc        |
+-------------+
| "2025.08.0" |
+-------------+

La versión de APOC coincide con la de Neo4j. Tras cada actualización de Neo4j, repite la copia para usar el JAR de la nueva versión y borra el anterior de plugins.

Paso 10: Hacer y restaurar copias de seguridad

En la edición Community, las copias se hacen con la base de datos detenida mediante neo4j-admin database dump, que genera un único archivo .dump. Crea el directorio de destino:

sudo mkdir -p /var/backups/neo4j
sudo chown neo4j:neo4j /var/backups/neo4j

Detén Neo4j, genera el volcado y vuelve a arrancarlo:

sudo systemctl stop neo4j
sudo -u neo4j neo4j-admin database dump neo4j --to-path=/var/backups/neo4j
sudo systemctl start neo4j

Comprueba que el archivo existe:

ls -lh /var/backups/neo4j
-rw-r--r-- 1 neo4j neo4j 13K Sep 25 11:02 neo4j.dump

Para restaurar, detén Neo4j y carga el volcado sobre la base de datos existente:

sudo systemctl stop neo4j
sudo -u neo4j neo4j-admin database load neo4j --from-path=/var/backups/neo4j --overwrite-destination=true
sudo systemctl start neo4j

Copia los archivos .dump fuera del servidor para que la copia sobreviva a un fallo del disco.

Solución de problemas

  • El servicio no arranca: revisa sudo journalctl -u neo4j -n 50 y /var/log/neo4j/. Lo más habitual es una versión de Java incorrecta (comprueba java -version) o un valor de memoria mayor que la RAM disponible en neo4j.conf.
  • The client is unauthorized due to authentication failure: la contraseña no coincide. Si fijaste la contraseña después del primer arranque, no se aplicó; cámbiala desde cypher-shell con ALTER CURRENT USER SET PASSWORD FROM 'actual' TO 'nueva';.
  • Unknown function 'apoc.version': el JAR no está en /var/lib/neo4j/plugins/, no pertenece al usuario neo4j o no has reiniciado el servicio.
  • Neo4j Browser no conecta con Bolt: el túnel debe reenviar también el puerto 7687, no solo el 7474.

Conclusión

Has instalado Neo4j Community Edition en Ubuntu 24.04, has ajustado su memoria, has creado un grafo con restricciones, índices y consultas de varios saltos en Cypher, has activado APOC y has hecho una copia de seguridad restaurable.

Como siguientes pasos, puedes:

  • Importar datos masivos desde CSV con LOAD CSV o con neo4j-admin database import para cargas iniciales grandes.
  • Conectar tu aplicación con el driver oficial de Neo4j para Python, JavaScript, Java o Go.
  • Automatizar los volcados con un temporizador de systemd y enviarlos a almacenamiento externo.