Cómo instalar y configurar la base de datos gráfica Neo4j en Ubuntu 22.04
Neo4j es una base de datos gráfica que se utiliza para crear relaciones de datos. Los datos de las bases de datos tradicionales se guardan en una estructura similar a una tabla. Una base de datos gráfica registra relaciones entre nodos de datos. Cada nodo almacena referencias a todos los demás nodos con los que está conectado. Las bases de datos tradicionales no guardan los datos de las relaciones directamente, pero pueden averiguar las conexiones buscando en las estructuras de datos con ayuda de la indexación, lo que es caro y lleva mucho tiempo. Una base de datos gráfica como Neo4j evita toda esta sobrecarga y puede codificar y consultar relaciones complejas.
Neo4j ha sido desarrollado por Neo Technology. Está escrito en Java y Scala, y está disponible tanto en versión gratuita para la comunidad como en versión para empresas. Neo4j utiliza su propio lenguaje de consulta llamado Cypher, pero las consultas pueden escribirse en otros estilos.
Este tutorial te enseñará a instalar y configurar Neo4j en un servidor Ubuntu 22.04.
Requisitos previos
- Un servidor que ejecute Ubuntu 22.04 con un mínimo de 1 núcleo de CPU y 2 GB de memoria. Tendrás que actualizar el servidor según los requisitos.
- Un usuario no root con privilegios sudo.
- Asegúrate de que todo está actualizado.
-
$ sudo apt update
- Instala los paquetes de utilidades básicas. Es posible que algunos de ellos ya estén instalados.
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
Paso 1 – Instalar Neo4j
El primer paso para instalar Neo4j es añadir la clave GPG.
$ curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg
Añade el repositorio Neo4j al directorio de fuentes de tu sistema APT.
$ echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable latest" | sudo tee -a /etc/apt/sources.list.d/neo4j.list
Para evitar el riesgo de actualizar a la siguiente versión mayor, puedes especificar las versiones mayor y menor necesarias en lugar de latest
en el comando anterior.
El comando siguiente añadirá el repositorio Neo4j 5.x, lo que significa que no acabarás actualizándote a la versión 6.x cuando salga.
$ echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable 5" | sudo tee -a /etc/apt/sources.list.d/neo4j.list
Actualiza la lista de repositorios del sistema.
$ sudo apt update
Lista las versiones de Neo4j disponibles para instalar.
$ apt list -a neo4j Listing... Done neo4j/stable 1:5.3.0 all neo4j/stable 1:5.2.0 all neo4j/stable 1:5.1.0 all
Instala la edición Comunidad de Neo4j.
$ sudo apt install neo4j
Puedes instalar una versión concreta utilizando el siguiente comando.
$ sudo apt install neo4j=1:5.3.0
Ten en cuenta que la versión incluye un componente de versión de época (1:), de acuerdo con la política de versiones de Debian.
Neo4j instalará automáticamente con él la versión JDK necesaria.
Habilita el servicio Neo4j.
$ sudo systemctl enable neo4j
Inicia el servicio Neo4j.
$ sudo systemctl start neo4j
Comprueba el estado del servicio Neo4j.
$ sudo systemctl status neo4j ? neo4j.service - Neo4j Graph Database Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2023-01-21 20:50:52 UTC; 33s ago Main PID: 5241 (java) Tasks: 72 (limit: 1030) Memory: 399.3M CPU: 20.350s CGroup: /system.slice/neo4j.service
Paso 2 – Prueba de conexión
Neo4j utiliza el Cypher Shell para trabajar con datos.
Conéctate al Cypher Shell.
$ cypher-shell
Se te pedirá un nombre de usuario y una contraseña. El nombre de usuario y la contraseña por defecto son neo4j
. Se te pedirá que elijas una nueva contraseña.
username: neo4j password: Password change required new password: confirm password: Connected to Neo4j using Bolt protocol version 5.0 at neo4j://localhost:7687 as user neo4j. Type :help for a list of available commands or :exit to exit the shell. Note that Cypher queries must end with a semicolon. neo4j@neo4j>
Esto confirma que la conexión al SGBD Neo4j se ha realizado correctamente.
Escribe :exit
para salir del intérprete de comandos.
neo4j@neo4j> :exit Bye!
Paso 3 – Configurar Neo4j para el acceso remoto
Para entornos de producción, puede que necesites confirmar que Neo4j acepta conexiones desde hosts remotos. Por defecto, Neo4j sólo acepta conexiones desde localhost
.
Podemos configurar Neo4j para que acepte conexiones de hosts remotos editando su archivo de configuración. Neo4j almacena su configuración en el archivo /etc/neo4j/neo4j.conf
. Ábrelo para editarlo.
$ sudo nano /etc/neo4j/neo4j.conf
Busca la línea comentada #dbms.default_listen_address=0.0.0.0
y descoméntala eliminando la almohadilla inicial.
. . . #***************************************************************** # Network connector configuration #***************************************************************** # With default configuration Neo4j only accepts local connections. # To accept non-local connections, uncomment this line: server.default_listen_address=0.0.0.0 . . .
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Por defecto, el valor 0.0.0.0
vinculará Neo4j a todas las interfaces IPv4 disponibles en tu sistema, incluido localhost. Si quieres limitar Neo4j a una dirección IP concreta, por ejemplo, una IP de red privada, especifica aquí la dirección IP asignada a la interfaz de red privada de tu servidor.
También puedes configurar Neo4j para que utilice interfaces IPv6. Al igual que con IPv4, puedes establecer el valor default_listen_address
a una dirección IPv6 específica que utilizarás para comunicarte con Neo4j. Si quieres limitar a Neo4j para que sólo utilice la dirección IPv6 local de tu servidor, especifica ::1
, que corresponde a localhost utilizando la notación IPv6.
Si configuras Neo4j con una dirección IPv6, no podrás conectarte con cypher-shell utilizando directamente la dirección IPv6. En su lugar, tendrás que configurar un nombre DNS que resuelva a la dirección IPv6, o añadir una entrada en el archivo /etc/hosts
del sistema remoto que mapee la dirección a un nombre. Entonces podrás utilizar el nombre DNS o del archivo hosts para conectarte a Neo4j utilizando IPv6 desde tu sistema remoto.
Por ejemplo, un servidor Neo4j con una dirección IPv6 como 2001:db8::1
requeriría que el sistema remoto de conexión tuviera una entrada /etc/hosts
, como se muestra a continuación.
2001:db8::1 your_hostname
Entonces podrás conectarte al servidor desde el sistema remoto utilizando el nombre que hayas especificado, como se muestra a continuación.
$ cypher-shell -a 'neo4j://your_hostname:7687'
Si restringes Neo4j para que utilice la dirección IPv6 localhost de ::1, entonces puedes conectarte a él localmente en el propio servidor Neo4j utilizando el nombre ip6-localhost preconfigurado de tu archivo /etc/hosts
que se muestra a continuación.
$ cypher-shell -a 'neo4j://ip6-localhost:7687'
Una vez que invoques cypher-shell
con el URI de conexión, se te pedirá tu nombre de usuario y contraseña como de costumbre.
Paso 4 – Configurar el acceso al cortafuegos (UFW)
Una vez que hayas habilitado las conexiones remotas, puedes utilizar el cortafuegos para restringir las conexiones de Neo4j de modo que sólo pueda conectarse a sistemas de confianza.
Neo4j crea dos sockets de red, uno en el puerto 7474 para la interfaz HTTP incorporada, y el protocolo principal del perno en el puerto 7687.
Ubuntu 22.04 utiliza por defecto el Cortafuegos sin complicaciones (UFW).
Configura el cortafuegos para permitir que un host remoto de confianza acceda a la interfaz bolt
utilizando IPv4 mediante el siguiente comando.
$ sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp
Sustituye el valor 203.0.113.1
por la dirección IP del sistema remoto de confianza. Del mismo modo, puedes permitir un rango de red completo utilizando el siguiente comando.
$ sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
Sustituye el valor 192.0.2.0/24
por la red real.
Para permitir el acceso a un host remoto mediante IPv6, puedes utilizar el siguiente comando.
$ sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp
Sustituye el valor 2001:DB8::1/128
por la dirección IPv6 de tu sistema de confianza.
Al igual que con IPv4, puedes permitir un rango de direcciones IPv6 utilizando el siguiente comando.
$ ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
De nuevo, sustituye el rango de red 2001:DB8::/32 resaltado por tu rango de red de confianza.
Recarga el cortafuegos para aplicar los cambios.
$ sudo ufw reload
Comprueba el estado del cortafuegos.
$ sudo ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) 7687/tcp ALLOW 203.0.113.1
Paso 5 – Utiliza Neo4j
Conéctate a Neo4j utilizando la herramienta cypher-shell
. Se te pedirá tu nombre de usuario y contraseña.
$ cypher-shell
Si has configurado Neo4j para acceso remoto, utiliza el siguiente comando para conectarte a Neo4j desde el sistema remoto.
$ cypher-shell -a 'neo4j://203.0.113.1:7687'
Aquí 203.0.113.1
es la dirección IP del servidor Neo4j.
Si utilizas IPv6, asegúrate de que tienes una entrada /etc/hosts
con el nombre descrito en el paso 3. A continuación, conéctate al servidor Neo4j como se indica a continuación.
$ cypher-shell -a 'neo4j://your_hostname:7687'
Asegúrate de que your_hostname
se mapea con la dirección IPv6 de tu servidor Neo4j en el archivo /etc/hosts
del sistema remoto.
Añadamos un nodo llamado Slite
y los nombres de los autores a Neo4j. El siguiente comando creará un nodo de tipo Slite
, con un nombre Navjot Singh
.
neo4j@neo4j> CREATE (:Slite {name: 'Navjot Singh'});
Obtendrás la siguiente salida.
0 rows ready to start consuming query after 124 ms, results consumed after another 0 ms Added 1 nodes, Set 1 properties, Added 1 labels
A continuación, añadiremos más empleados y los relacionaremos mediante una relación llamada COLLEAGUE
. Puedes enlazar nodos con relaciones de nombre arbitrario.
Añade tres empleados más y relaciónalos utilizando la relación COLLEAGUE
.
neo4j@neo4j> CREATE (:Slite {name: 'Sammy'})-[:COLLEAGUE]-> (:Slite {name: 'Peter Jack'})-[:COLLEAGUE]-> (:Slite {name: 'Chris Rock'});
Obtendrás un resultado similar.
0 rows ready to start consuming query after 72 ms, results consumed after another 0 ms Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels
Ahora vamos a crear algunas relaciones.
Como Peter y Chris trabajan en el mismo departamento y tienen las mismas propiedades como nodos, crearemos una relación con la columna nombre.
neo4j@neo4j> MATCH (a:Slite),(b:Slite) WHERE a.name = 'Peter Jack' AND b.name = 'Chris Rock' CREATE (a)-[r:DEPARTMENT { name: 'Designers' }]->(b) RETURN type(r), r.name; +----------------------------+ | type(r) | r.name | +----------------------------+ | "DEPARTMENT" | "Designers" | +----------------------------+ 1 row ready to start consuming query after 60 ms, results consumed after another 17 ms Created 1 relationships, Set 1 properties
Ahora, creemos otra relación entre Sammy y Peter, ya que trabajan en el mismo proyecto.
neo4j@neo4j> MATCH (a:Slite), (b:Slite) WHERE a.name = 'Peter Jack' AND b.name = 'Sammy' CREATE (a)-[r:PROJECT { name: 'Test Project 1' }]->(b) RETURN type(r), r.name; +------------------------------+ | type(r) | r.name | +------------------------------+ | "PROJECT" | "Test Project 1" | +------------------------------+ 1 row ready to start consuming query after 132 ms, results consumed after another 12 ms Created 1 relationships, Set 1 properties
Visualicemos todos estos datos mediante la siguiente consulta.
neo4j@neo4j> MATCH (a)-[r]->(b) RETURN a.name,r,b.name ORDER BY r; +-------------------------------------------------------------------+ | a.name | r | b.name | +-------------------------------------------------------------------+ | "Sammy" | [:COLLEAGUE] | "Peter Jack" | | "Peter Jack" | [:COLLEAGUE] | "Chris Rock" | | "Peter Jack" | [:DEPARTMENT {name: "Designers"}] | "Chris Rock" | | "Peter Jack" | [:PROJECT {name: "Test Project 1"}] | "Sammy" | +-------------------------------------------------------------------+ 4 rows ready to start consuming query after 99 ms, results consumed after another 5 ms
Conclusión
Con esto concluye nuestro tutorial sobre la instalación y configuración de Neo4j en un servidor Ubuntu 22.04. Si tienes alguna pregunta, publícala en los comentarios a continuación.