Introducción
En este tutorial, examinaremos qué es Neo4j, para qué se usa y cómo se implementa. También instalaremos y configuraremos la instalación en un servidor Ubuntu 20.04. Neo4j es una base de datos gráfica utilizada para crear relaciones de datos. Otros ejemplos de bases de datos gráficas incluyen:
- ArangoDB
- Núcleo Grakn
- Microsoft SQL Server 2017
- OrientDB
- RedisGraph
Qué es Neo4j
Neo4j conecta los datos a medida que se almacenan, lo que nos permite ejecutar consultas que nunca antes sabíamos o en las que habíamos pensado. En pocas palabras, Neo4j registra la relación entre los nodos de datos, mientras que las bases de datos relacionales convencionales usan columnas y filas para almacenar datos estructurados. Dado que cada nodo almacena referencias a todos los demás nodos a los que está conectado, Neo4j puede codificar y consultar relaciones complejas con una sobrecarga mínima.
Neo Technology es el creador y desarrollador del software de código abierto Neo4j. La empresa lo ha estado desarrollando desde 2003. Está escrito en Java y Scala, y el código fuente está disponible gratuitamente en GitHub. A partir de 2015, se considera el sistema de gestión de bases de datos gráficas más utilizado en la actualidad. Neo4j emplea su propio lenguaje de consulta llamado Cypher, pero las consultas también se pueden escribir en otros estilos, por ejemplo, a través de la API de Java.
Requisitos
Para esta instalación, el software requiere la siguiente configuración básica.
- 8 GB de RAM y un servidor de cuatro núcleos. Como mínimo, el uso recomendado es 1 GB de RAM y un servidor de un solo núcleo.
- SO Ubuntu 20.04
- Todos los comandos se ejecutan como root. Si es un usuario normal, los comandos deben estar precedidos por el comando sudo.
Instalación de Neo4j
Agregar repositorio
Ubuntu no contiene oficialmente Neo4j en el repositorio de paquetes estándar. Agregaremos la fuente del paquete que apunta a la ubicación del repositorio de Neo4j, luego agregaremos la clave GPG de Neo4j para verificar, luego instalaremos Neo4j.
Empezamos actualizando la lista de paquetes y los propios paquetes.
root@host:~# apt update && apt -y upgrade
Agregar software adicional
En este paso, instalaremos un paquete adicional que se necesita para las conexiones HTTPS. Es posible que esta aplicación ya esté instalada de manera predeterminada en el sistema, pero aún deben actualizarse.
root@host:~# apt install apt-transport-https ca-certificates curl software-properties-common -y
El apt-transporte-https El paquete habilita el uso de https a través del administrador de paquetes usando libapt-pkg biblioteca. Esto mantiene la instalación segura.
Verificar clave de seguridad
Ahora agregamos la clave de seguridad oficial para el repositorio de paquetes de Neo4j. Esta clave verifica y verifica que lo que está instalando es del repositorio oficial.
root@host:~# curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | apt-key add -
OK
root@host:~#
Agregar repositorio
Agregue el repositorio oficial de Neo4j a la lista de administradores de paquetes.
root@host:~# add-apt-repository "deb https://debian.neo4j.com stable 4.1"
Instalar Neo4j
A la hora de instalar Neo4j y todas sus dependencias, es fundamental tener en cuenta que la instalación nos pedirá que instalemos paquetes de Java para trabajar con Neo4j. Durante la instalación, presione Y. para aceptar la instalación de este software. Si tiene Java instalado, el instalador comprenderá y omitirá este paso.
root@host:~# apt install neo4j -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libfprint-2-tod1
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
cypher-shell
The following NEW packages will be installed:
cypher-shell neo4j
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 116 MB of archives.
After this operation, 131 MB of additional disk space will be used.
Get:1 https://debian.neo4j.com stable/4.1 amd64 cypher-shell all 4.1.3 [27,1 MB]
Get:2 https://debian.neo4j.com stable/4.1 amd64 neo4j all 1:4.1.5 [88,4 MB]
Fetched 116 MB in 10s (11,1 MB/s)
Preconfiguring packages ...
Selecting previously unselected package cypher-shell.
(Reading database ... 163626 files and directories currently installed.)
Preparing to unpack .../cypher-shell_4.1.3_all.deb ...
Unpacking cypher-shell (4.1.3) ...
Selecting previously unselected package neo4j.
Preparing to unpack .../neo4j_1%3a4.1.5_all.deb ...
Unpacking neo4j (1:4.1.5) ...
Setting up cypher-shell (4.1.3) ...
Setting up neo4j (1:4.1.5) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for systemd (245.4-4ubuntu3.3) ...
root@host:~#
Iniciar el Servicio Neo4j
Una vez que lo tengamos instalado, debemos habilitarlo como un servicio de neo4j.service.
root@host:~# systemctl enable neo4j.service
Synchronizing state of neo4j.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable neo4j
Created symlink /etc/systemd/system/multi-user.target.wants/neo4j.service → /lib/systemd/system/neo4j.service.
root@host:~#
Comprobar el estado de Neo4j
A continuación, verificamos que todo funciona como se esperaba.
root@host:~# systemctl status neo4j.service
neo4j.service - Neo4j Graph Database
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset:>
Active: active (running) since Wed 2020-12-23 20:04:44 +03; 2min 4s ago
Main PID: 4827 (java)
Tasks: 52 (limit: 9489)
Memory: 447.9M
CGroup: /system.slice/neo4j.service
└─4827 /usr/bin/java -cp /var/lib/neo4j/plugins:/etc/neo4j:/usr/sh>
сне 23 20:04:46 host neo4j[4827]: 2020-12-23 17:04:46.101+0000 INFO ======== N>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.073+0000 INFO Initializi>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.077+0000 INFO Setting up>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.077+0000 INFO Creating n>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.083+0000 INFO Setting ve>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.085+0000 INFO After init>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.088+0000 INFO Performing>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.197+0000 INFO Bolt enabl>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.843+0000 INFO Remote int>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.844+0000 INFO Started.
lines 1-19/19 (END)
To exit this screen, press Ctrl + C.
It is important to have the following parameters:
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset:>
Active: active (running) since Wed 2020-12-23 20:04:44 +03; 2min 4s ago
Conexión de base de datos de prueba
Como instalamos Neo4j y lo iniciamos como un servicio, ahora probaremos la conexión de la base de datos y configuraremos el usuario administrador.
Nota:estamos utilizando la versión gratuita Community Edition Neo4j. Admite el trabajo simultáneo con la misma base de datos, pero no incluye la asignación de roles y permisos a los usuarios.Trabajar con Neo4j
Para interactuar con la base de datos, lanzaremos la utilidad interna llamada cypher-shell para trabajar con Neo4j. Cuando lo ejecutamos por primera vez, se nos pedirá que ingresemos un usuario y una contraseña. De forma predeterminada, el nombre de usuario es neo4j y la contraseña es neo4j. Después del primer inicio de sesión, se le pedirá que cambie la contraseña por una de su elección.
oot@host:~# cypher-shell
username: neo4j
password: *****
Password change required
new password: ********
Connected to Neo4j 4.1.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>
Para salir, utilice el comando de salida.
neo4j@neo4j> exit
Bye!
root@host:~#
Añadir nodos
Configuremos algunos nodos de muestra y definamos las relaciones entre ellos. Conéctate usando Cypher
root@host:~# cypher-shell
username: neo4j
password: ********
Connected to Neo4j 4.1.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>
A continuación, agreguemos un nodo llamado Liquidweb y los nombres de los colegas que trabajan para esta empresa con el nombre de Margaret. Podemos hacer esto usando el comando CREAR, y la sintaxis será la siguiente.
neo4j@neo4j> CREATE (:Liquidweb {name: 'Margaret'});
0 rows available after 36 ms, consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels
neo4j@neo4j>
Agregar usuarios
Agreguemos algunos colegas más y vinculémoslos a la empresa para la que trabajan, Liquidweb. Nos conectaremos usando el comando AMIGO.
neo4j@neo4j> CREATE (:Liquidweb {name: 'John'})-[:FRIEND]->
(:Liquidweb {name: 'Peter'})-[:FRIEND]->
(:Liquidweb {name: 'Chris'});
0 rows available after 38 ms, consumed after another 0 ms
Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels
neo4j@neo4j>
Crear relaciones
Dado que Peter y Chris trabajan en el mismo departamento y tienen las mismas propiedades que los nodos, crearemos una relación con la columna de nombre.
neo4j@neo4j> MATCH (a:Liquidweb),(b:Liquidweb)
WHERE a.name = 'Peter' AND b.name = 'Chris'
CREATE (a)-[r:DEPARTMENT { name: 'Developers' }]->(b)
RETURN type(r), r.name;
+------------------------+
| type(r) | r.name |
+------------------------+
| "DEPARTMENT" | "Developers" |
+------------------------+
1 row available after 105 ms, consumed after another 10 ms
Created 1 relationships, Set 1 properties
neo4j@neo4j>
- COINCIDIR - Esto indica la correspondencia de los nodos. En este caso, dentro de una empresa Liquidweb
- DONDE - entre valores
- CREAR:crear y agregar
- VOLVER - Regresa a la base.
Ahora cree una conexión entre John y Chris, aunque están en diferentes departamentos, pero están trabajando en el mismo proyecto.neo4j@neo4j> MATCH (a:Liquidweb),(b:Liquidweb)
WHERE a.name = 'John' AND b.name = 'Chris'
CREATE (a)-[r:PROJECT { name: 'Cool Project' }]->(b)
RETURN type(r), r.name;
+----------------------------+
| type(r) | r.name |
+----------------------------+
| "PROJECT" | "Cool Project" |
+----------------------------+
1 row available after 48 ms, consumed after another 5 ms
Created 1 relationships, Set 1 properties
neo4j@neo4j>
Mostrar información
Ahora mostraremos todos estos datos y sus relaciones usando la siguiente consulta.
neo4j@neo4j> Match (n)-[r]->(m)
Return n,r,m;
+--------------------------------------------------------------------------------------------------+
| n | r | m |
+--------------------------------------------------------------------------------------------------+
| (:Liquidweb {name: "John"}) | [:FRIEND] | (:Liquidweb {name: "Peter"}) |
| (:Liquidweb {name: "John"}) | [:PROJECT {name: "Cool Project"}] | (:Liquidweb {name: "Chris"}) |
| (:Liquidweb {name: "Peter"}) | [:DEPARTMENT {name: "Developers"}] | (:Liquidweb {name: "Chris"}) |
| (:Liquidweb {name: "Peter"}) | [:FRIEND] | (:Liquidweb {name: "Chris"}) |
+--------------------------------------------------------------------------------------------------+
4 rows available after 17 ms, consumed after another 2 ms
neo4j@neo4j>
Recibimos los datos de salida con las siguientes relaciones de AMIGOS, que muestran la relación y las siguientes relaciones de datos entre DEPARTAMENTO y PROYECTO.
Para salir del shell de cifrado, ejecute el comando de salida.
neo4j@neo4j> :exit
Bye!
root@host:~#
Configurar una conexión remota segura a Neo4j
No siempre podremos conectarnos a la base de datos desde el propio servidor. Si queremos configurar la aplicación para usar Neo4j, necesitaremos configurarla para conectarse de forma segura a otros servidores. Además, debemos configurar el firewall para restringir qué servidores pueden conectarse a Neo4j.
De forma predeterminada, Neo4j se conecta a través de localhost (127.0.0.1 - localhost - diseñado para probar aplicaciones sin trabajar con otros servidores). Además, el trabajo de Neo4j de localhost no estará abierto para el acceso público a Internet. Solo los usuarios con acceso a la red local podrán conectarse a Neo4j.
Configurar Neo4j
Para que Neo4j se conecte a otros servidores, debemos cambiar la configuración del archivo de configuración /etc/neo4j/neo4j.conf . Usaremos el editor nano para esta tarea. Recuerda, si no eres root, usa el comando sudo.
root@host:~# nano /etc/neo4j/neo4j.conf
root@host:~#
Encuentra la línea en la sección Conector de red
#dbms.default_listen_address=0.0.0.0
Descomente esta línea eliminando el símbolo # y luego presione Ctrl + S y Ctrl + X para guardar y salir del editor.
El valor 0.0.0.0 vinculará Neo4j a todas las interfaces de red IPv4 disponibles. Puede poner una dirección IP o red específica que sus servidores usen como ruta de datos. También puede configurarlo para usar interfaces IPv6, pero hay muchos matices en esa configuración. Le recomendamos que lea la documentación en el sitio web oficial.
Configurar cortafuegos para conexiones remotas
Para configurar el software Neo4j para conexiones remotas, debemos configurar el firewall. Restringimos el acceso para que solo los sistemas confiables puedan conectarse. En este caso, usaremos el firewall predeterminado de Ubuntu, UFW.
A continuación, debemos comprobar si el cortafuegos está activado. Si no está activo, tenemos que habilitarlo.
root@host:~# ufw enable
Firewall is active and enabled on system startup
root@host:~#
Neo4j crea dos sockets de red al instalar el software. Uno en el puerto 7474 para la interfaz HTTP y otro para el protocolo principal en el puerto 7687. Neo4j recomienda usar el puerto 7687. El comando para abrir un puerto será similar al siguiente comando que se usa para permitir una dirección IPv4.
ufw allow from YOUR_IP to any port 7687 proto tcp
YOUR_IP - Use an IP here to provide access permission. If you want to allow access to the entire local network, use the following rule:
ufw allow from 192.168.50.0/16 to any port 7687 proto tcp
Ingrese su rango de red específico para abrir el puerto. Para una dirección IPv6, el comando se verá así.
ufw allow from fe80::1006:f7a3:b9cc:b0cb to any port 7687 proto tcp
Las direcciones IP anteriores se utilizan como ejemplo. Sustituya sus valores y agregue una regla.
root@host:~# ufw allow from 192.168.50.189 to any port 7687 proto tcp
Rule added
root@host:~#
Reiniciar cortafuegos
Asegúrese de reiniciar su cortafuegos.
root@host:~# ufw reload
Firewall reloaded
root@host:~#
Verificar conexión
Ahora vamos a comprobar si funciona correctamente.
root@host:~# ufw status
Status: active
To Action From
-- ------ ----
7687/tcp ALLOW 192.168.50.189
root@host:~#
Y con eso, tenemos un servidor Neo4j en funcionamiento que está listo para funcionar y configurado para permitir el acceso en el puerto 7687.
Conclusión
Nos reunimos con la base de datos gráfica de Neo4j, aprendimos cómo funciona y por qué es necesaria. Configure un administrador de paquetes y luego instale Neo4j. A continuación, verificamos la funcionalidad, entramos y cambiamos la contraseña. Probamos comandos básicos sobre cómo crear una tabla, establecer relaciones y configurar nodos. Al final, configuramos la conexión a las IP que necesitábamos y configuramos un firewall por seguridad.