Guía de despliegue

Neo4j en un VPS: base de datos de grafos, Cypher y GraphRAG

Desplegar en un VPS Cloud →

Neo4j en un VPS: base de datos de grafos, Cypher y GraphRAG

Algunos datos no encajan bien en tablas: quién conoce a quién, qué servicio depende de cuál, qué documento cita qué contrato. En SQL, cada nivel de relación cuesta una unión. Neo4j, la base de datos de grafos más extendida, almacena directamente los nodos y sus relaciones y los consulta en Cypher. Esta guía instala Neo4j Community Edition en un VPS con Docker Compose, publica Neo4j Browser y la conexión Bolt en HTTPS con un solo nombre, y después conecta una aplicación y sienta las bases de un GraphRAG.

7 min de lectura3 pasos
Contenido· Qué hace Neo4j1/12
  1. 01Qué hace Neo4j
  2. 02Lo que aporta Neo4j
  3. 03Neo4j frente a otras opciones
  4. 04Requisitos previos
  5. 05Instalar Neo4j con Docker Compose
  6. 06No publiques nunca 7474 ni 7687 en Internet
  7. 07Poner Neo4j detrás de nginx en HTTPS
  8. 08Primeras consultas Cypher
  9. 09Conectar una aplicación
  10. 10GraphRAG: dar hechos conectados a un asistente de IA
  11. 11Copias de seguridad y actualizaciones
  12. 12Instalación en un clic en ServOrbit

Qué hace Neo4j

Neo4j registra nodos — un cliente, un producto, un servidor — con etiquetas (:Person, :Product) y propiedades, conectados por relaciones dirigidas y con nombre (:KNOWS, :BOUGHT, :DEPENDS_ON). Una relación se almacena como un enlace directo entre dos nodos: seguirla no requiere buscar en un índice, por grande que sea la base.

Se consulta en Cypher, un lenguaje que dibuja el patrón buscado: (a:Person)-[:KNOWS]->(b:Person). Los caminos de longitud variable (-[:KNOWS*1..3]->), los caminos más cortos y las agregaciones caben en una línea, donde SQL apila uniones o consultas recursivas.

Lo que aporta Neo4j

  • Cypher — MATCH, MERGE, caminos de longitud variable y caminos más cortos, en un lenguaje legible.
  • Neo4j Browser — una interfaz web que ejecuta las consultas y dibuja el grafo obtenido.
  • API HTTP — una consulta Cypher por llamada POST, respuesta en JSON, desde cualquier lenguaje.
  • Drivers oficiales en Bolt — Python, JavaScript, Java, Go y .NET.
  • Índices y restricciones — unicidad, búsqueda de texto completo e índices vectoriales para embeddings.
  • Transacciones ACID — un grafo coherente, incluso cuando varias aplicaciones escriben en él.

Neo4j frente a otras opciones

Desplace la tabla

Neo4jPostgreSQLQdrant
ModeloNodos y relacionesTablas y unionesVectores y metadatos
ConsultasCypherSQLBúsqueda por similitud
Punto fuerteRelaciones en varios nivelesTransacciones y datos en tablasBúsqueda semántica
Papel en un RAGHechos conectados y con fuenteDatos de negocioPasajes cercanos a la pregunta
CostePrecio del VPSPrecio del VPSPrecio del VPS

Requisitos previos

Un VPS Ubuntu 24.04 con 2 GB de RAM y 20 GB de disco, Docker y el plugin Compose instalados, nginx y Certbot en el host, y un subdominio que apunte al VPS, por ejemplo neo4j.example.com. Neo4j es más rápido cuando el grafo cabe en su caché de páginas: prevé más memoria para un grafo de decenas de millones de nodos.

Instalar Neo4j con Docker Compose

  1. Preparar el directorio y la contraseña

    El archivo .env contiene la contraseña del usuario neo4j. La carpeta backups recibirá las copias de seguridad: pertenece al usuario 7474, el del contenedor.

    mkdir -p /opt/neo4j/backups && cd /opt/neo4j
    echo "NEO4J_PASSWORD=$(openssl rand -hex 16)" > .env
    chmod 600 .env
    chown 7474:7474 backups
  2. Escribir el archivo docker-compose.yml

    Los dos puertos se publican solo en la interfaz local: 7474 para Neo4j Browser y la API HTTP, 7687 para Bolt. NEO4J_AUTH crea el usuario neo4j con tu contraseña en el primer arranque, y la dirección Bolt anunciada es la que nginx publicará en HTTPS.

    services:
      neo4j:
        image: neo4j:2026.10.2-community
        restart: unless-stopped
        ports:
          - "127.0.0.1:7474:7474"
          - "127.0.0.1:7687:7687"
        environment:
          NEO4J_AUTH: neo4j/${NEO4J_PASSWORD}
          NEO4J_server_bolt_advertised__address: neo4j.example.com:443
          NEO4J_server_memory_heap_initial__size: 512m
          NEO4J_server_memory_heap_max__size: 512m
          NEO4J_server_memory_pagecache_size: 512m
        volumes:
          - neo4j-data:/data
          - neo4j-logs:/logs
    volumes:
      neo4j-data: {}
      neo4j-logs: {}
  3. Arrancar Neo4j

    El primer arranque tarda unos treinta segundos; después la raíz responde con un pequeño documento JSON que da la versión y las direcciones de conexión.

    docker compose up -d
    docker compose ps
    curl -s http://127.0.0.1:7474/

No publiques nunca 7474 ni 7687 en Internet

Deja los dos puertos en 127.0.0.1: una base de datos accesible directamente desde Internet se escanea en pocas horas. nginx lleva el HTTPS en el 443, y la conexión Bolt del navegador pasa por el mismo nombre en WebSocket. Conserva también NEO4J_AUTH: sin él, el usuario neo4j arranca con la contraseña de fábrica neo4j, que todo el mundo conoce.

Poner Neo4j detrás de nginx en HTTPS

Neo4j Browser necesita dos cosas: la interfaz HTTP y una conexión Bolt, que el navegador abre en WebSocket. nginx dirige ambas con el mismo nombre: las peticiones normales al 7474, las de WebSocket al 7687.

map $http_upgrade $neo4j_backend {
    default   127.0.0.1:7474;
    websocket 127.0.0.1:7687;
}
server {
    listen 80;
    server_name neo4j.example.com;
    location / {
        proxy_pass http://$neo4j_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600s;
    }
}
certbot --nginx -d neo4j.example.com

Abre después https://neo4j.example.com. En Neo4j Browser, escribe neo4j+s://neo4j.example.com:443 como Connect URL, el usuario neo4j y tu contraseña.

Primeras consultas Cypher

En Neo4j Browser, crea una restricción de unicidad, algunos nodos y sus relaciones, y luego sigue un camino de dos niveles como máximo. MERGE solo crea un nodo o una relación si todavía no existe: la consulta se puede repetir sin duplicados.

CREATE CONSTRAINT person_name IF NOT EXISTS FOR (p:Person) REQUIRE p.name IS UNIQUE;
MERGE (sara:Person {name: 'Sara'})
MERGE (yassine:Person {name: 'Yassine'})
MERGE (casa:City {name: 'Casablanca'})
MERGE (sara)-[:KNOWS]->(yassine)
MERGE (yassine)-[:LIVES_IN]->(casa);
MATCH (p:Person {name: 'Sara'})-[:KNOWS*1..2]->(f)-[:LIVES_IN]->(c:City)
RETURN f.name, c.name;

El Browser dibuja el resultado; el comando :guide abre sus tutoriales integrados, y :sysinfo muestra el tamaño de la base y el uso de la caché.

Conectar una aplicación

Desde cualquier lenguaje, la API HTTP recibe una consulta Cypher por POST y responde en JSON, con autenticación HTTP básica. Una aplicación instalada en el mismo VPS usa más bien un driver oficial en Bolt, en bolt://127.0.0.1:7687. Desde tu equipo de desarrollo, un túnel SSH hace accesible el mismo puerto sin abrirlo a Internet.

curl -s -u neo4j:$NEO4J_PASSWORD \
  -H 'Content-Type: application/json' \
  -d '{"statement": "MATCH (p:Person) RETURN p.name LIMIT 5"}' \
  https://neo4j.example.com/db/neo4j/query/v2
from neo4j import GraphDatabase

driver = GraphDatabase.driver("bolt://127.0.0.1:7687", auth=("neo4j", "<mot-de-passe>"))
records, _, _ = driver.execute_query("MATCH (p:Person) RETURN p.name AS name")
print([r["name"] for r in records])
ssh -L 7687:127.0.0.1:7687 [email protected]

Usa el esquema bolt:// y no neo4j:// para una conexión local: el segundo pide la tabla de enrutamiento, que anuncia la dirección pública en el puerto 443.

GraphRAG: dar hechos conectados a un asistente de IA

Un RAG clásico recupera pasajes cercanos a la pregunta. Un GraphRAG añade las relaciones: las entidades extraídas de los documentos (personas, contratos, productos) se convierten en nodos, conectados entre sí y con los pasajes que las citan. Neo4j guarda ambos en la misma base, gracias a sus índices vectoriales.

CREATE VECTOR INDEX chunk_embedding IF NOT EXISTS
FOR (c:Chunk) ON c.embedding
OPTIONS {indexConfig: {`vector.dimensions`: 768, `vector.similarity_function`: 'cosine'}};

La búsqueda vectorial encuentra los pasajes pertinentes y luego una consulta Cypher sigue sus relaciones para reunir el contexto: el asistente responde con hechos conectados y la fuente de cada uno. Los embeddings pueden venir de un modelo local servido por Ollama en el mismo VPS.

Copias de seguridad y actualizaciones

En Community Edition, la copia se hace con la base detenida, con neo4j-admin database dump: unos segundos de interrupción para un grafo de tamaño medio. Prográmala por la noche.

cd /opt/neo4j
docker compose stop neo4j
docker compose run --rm -v /opt/neo4j/backups:/backups neo4j \
  neo4j-admin database dump neo4j --to-path=/backups --overwrite-destination=true
docker compose start neo4j

Copia después backups/neo4j.dump fuera del VPS. Para actualizar, cambia la versión de la imagen en docker-compose.yml y luego docker compose pull && docker compose up -d, justo después de una copia; lee las notas de la versión antes de cambiar de versión mayor.

Instalación en un clic en ServOrbit

Desde el Marketplace de tu área de cliente, Neo4j se instala en un VPS de ServOrbit sin escribir una línea: Neo4j Community Edition se despliega detrás de un pequeño proxy que sirve Neo4j Browser, la API HTTP y la conexión Bolt en un solo puerto, la contraseña del usuario neo4j se genera y aparece en tu área de cliente, y todo se publica en HTTPS en tu dominio o en el subdominio gratuito del VPS. El puerto Bolt sigue disponible en local, en bolt://127.0.0.1:7687, para tus aplicaciones.

Compartir este artículoservorbit.com/ma-es/blog/autoalojar-neo4j-vps-base-de-datos-grafos