Inleiding
In deze tutorial zullen we onderzoeken wat Neo4j is, waarvoor het wordt gebruikt en hoe het wordt geïmplementeerd. We zullen de installatie ook installeren en configureren op een Ubuntu 20.04-server. Neo4j is een grafische database die wordt gebruikt om gegevensrelaties te creëren. Andere voorbeelden van grafische databases zijn:
- ArangoDB
- Grakn Core
- Microsoft SQL Server 2017
- OrientDB
- RedisGraph
Wat is Neo4j
Neo4j verbindt gegevens terwijl deze worden opgeslagen, waardoor we query's kunnen uitvoeren die we nooit eerder wisten of waar we nooit aan hadden gedacht. Simpel gezegd, Neo4j legt de relatie tussen gegevensknooppunten vast, terwijl conventionele relationele databases kolommen en rijen gebruiken om gestructureerde gegevens op te slaan. Aangezien elk knooppunt verwijzingen opslaat naar alle andere knooppunten waarmee het is verbonden, kan Neo4j complexe relaties coderen en opvragen met minimale overhead.
Neo Technology is de maker en ontwikkelaar van de open-source software Neo4j. Het bedrijf ontwikkelt het sinds 2003. Het is geschreven in Java en Scala en de broncode is vrij beschikbaar op GitHub. Vanaf 2015 wordt het beschouwd als het meest gebruikte grafische databasebeheersysteem dat tegenwoordig wordt gebruikt. Neo4j gebruikt zijn eigen querytaal genaamd Cypher, maar query's kunnen ook in andere stijlen worden geschreven, bijvoorbeeld via de Java API.
Vereisten
Voor deze installatie heeft de software de volgende basisinstellingen nodig.
- 8 GB RAM en een vier-core server. Het aanbevolen gebruik is minimaal 1 GB RAM en een single-core server.
- Ubuntu 20.04 besturingssysteem
- Alle commando's worden uitgevoerd als root. Als u een gewone gebruiker bent, moeten opdrachten worden voorafgegaan door de opdracht sudo.
Neo4j-installatie
Repository toevoegen
Ubuntu bevat officieel geen Neo4j in de standaard pakketrepository. We voegen de pakketbron toe die verwijst naar de locatie van de Neo4j-repository, voegen vervolgens de GPG-sleutel van Neo4j toe voor verificatie en installeren vervolgens Neo4j zelf.
We beginnen met het bijwerken van de lijst met pakketten en de pakketten zelf.
root@host:~# apt update && apt -y upgrade
Extra software toevoegen
In deze stap zullen we een extra pakket installeren dat nodig is voor HTTPS-verbindingen. Deze applicatie is mogelijk al standaard op het systeem geïnstalleerd, maar moet nog worden bijgewerkt.
root@host:~# apt install apt-transport-https ca-certificates curl software-properties-common -y
De apt-transport-https pakket maakt het gebruik van https mogelijk via de pakketbeheerder met behulp van de libapt-pkg bibliotheek. Dit houdt de installatie veilig.
Beveiligingssleutel verifiëren
Nu voegen we de officiële beveiligingssleutel toe voor de Neo4j-pakketrepository. Deze sleutelcontrole en verifieert dat wat u installeert afkomstig is uit de officiële repository.
root@host:~# curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | apt-key add -
OK
root@host:~#
Repository toevoegen
Voeg de officiële Neo4j-repository toe aan de lijst met pakketbeheerders.
root@host:~# add-apt-repository "deb https://debian.neo4j.com stable 4.1"
Neo4j installeren
Bij het installeren van Neo4j en al zijn afhankelijkheden, is het essentieel om op te merken dat de installatie ons zal vragen om Java-pakketten te installeren om met Neo4j te werken. Druk tijdens de installatie op Y. om deze software-installatie te accepteren. Als je Java hebt geïnstalleerd, zal het installatieprogramma deze stap begrijpen en overslaan.
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:~#
Start de Neo4j-service
Zodra we het hebben geïnstalleerd, moeten we het inschakelen als een neo4j.service-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:~#
Controleer de Neo4j-status
Vervolgens controleren we of alles werkt zoals verwacht.
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
DB-verbinding testen
Aangezien we Neo4j hebben geïnstalleerd en het als een service zijn gestart, zullen we nu de databaseverbinding testen en de admin-gebruiker configureren.
Opmerking:we gebruiken de gratis Community Edition Neo4j-versie. Het ondersteunt gelijktijdig werken met dezelfde database, maar omvat niet het toewijzen van rollen en machtigingen aan gebruikers.Werken met Neo4j
Om met de database te communiceren, starten we het interne hulpprogramma cypher-shell om met Neo4j te werken. Wanneer we het voor het eerst uitvoeren, worden we gevraagd om een gebruiker en wachtwoord in te voeren. Standaard is de gebruikersnaam neo4j en het wachtwoord neo4j. Na de eerste keer inloggen, wordt u gevraagd het wachtwoord te wijzigen in een wachtwoord naar keuze.
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>
Gebruik het exit-commando om af te sluiten.
neo4j@neo4j> exit
Bye!
root@host:~#
Nodes toevoegen
Laten we enkele voorbeeldknooppunten instellen en relaties tussen deze definiëren. Maak verbinding met 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>
Laten we vervolgens een knooppunt met de naam Liquidweb toevoegen en de namen van collega's die voor dit bedrijf werken onder de naam Margaret. We kunnen dit doen met de opdracht CREATE, en de syntaxis zal als volgt zijn.
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>
Gebruikers toevoegen
Laten we nog een paar collega's toevoegen en ze koppelen aan het bedrijf waarvoor ze werken, Liquidweb. We zullen verbinding maken met het FRIEND-commando.
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>
Relaties creëren
Aangezien Peter en Chris op dezelfde afdeling werken en dezelfde eigenschappen hebben als knooppunten, zullen we een relatie maken met de naamkolom.
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>
- MATCH - Dit geeft de overeenkomst van de knooppunten aan. In dit geval binnen één bedrijf Liquidweb
- WAAR - tussen waarden
- CREATE - maken en toevoegen
- RETURN - Keer terug naar de basis.
Maak nu een verbinding tussen John en Chris, hoewel ze op verschillende afdelingen zitten, maar aan hetzelfde project werken.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>
Informatie weergeven
Nu zullen we al deze gegevens en hun relaties weergeven met behulp van de volgende query.
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>
We hebben de uitvoergegevens ontvangen met de volgende VRIEND-relaties, die de relatie en de volgende gegevensrelaties tussen AFDELING en PROJECT laten zien.
Voer het exit-commando uit om de cypher-shell te verlaten.
neo4j@neo4j> :exit
Bye!
root@host:~#
Stel een veilige externe verbinding in met Neo4j
We kunnen niet altijd verbinding maken met de database vanaf de server zelf. Als we de applicatie willen configureren om Neo4j te gebruiken, moeten we deze configureren om veilig verbinding te maken met andere servers. We moeten ook de firewall configureren om te beperken welke servers kunnen koppelen aan Neo4j.
Neo4j maakt standaard verbinding via localhost (127.0.0.1 - localhost - bedoeld voor het testen van applicaties zonder met andere servers te werken). Ook zal het werk van Neo4j van localhost niet openstaan voor publieke toegang tot internet. Alleen gebruikers met toegang tot het lokale netwerk kunnen verbinding maken met Neo4j.
Neo4j configureren
Om Neo4j verbinding te laten maken met andere servers, moeten we de instellingen van het configuratiebestand /etc/neo4j/neo4j.conf wijzigen . We zullen de nano-editor voor deze taak gebruiken. Denk eraan, als je geen root bent, gebruik dan het sudo-commando.
root@host:~# nano /etc/neo4j/neo4j.conf
root@host:~#
Zoek de lijn in het gedeelte Netwerkconnector
#dbms.default_listen_address=0.0.0.0
Maak het commentaar van deze regel ongedaan door het # -symbool te verwijderen en druk vervolgens op Ctrl + S en Ctrl + X om op te slaan en de editor af te sluiten.
De 0.0.0.0-waarde zal Neo4j binden aan alle beschikbare IPv4-netwerkinterfaces. U kunt een specifiek IP-adres of netwerk plaatsen dat uw servers gebruiken als gegevenspad. Je kunt het ook configureren om IPv6-interfaces te gebruiken, maar er zijn veel nuances in die instelling. We raden u aan de documentatie op de officiële website te lezen.
Firewall configureren voor externe verbindingen
Om de Neo4j-software te configureren voor externe verbindingen, moeten we de firewall configureren. We beperken de toegang zodat alleen vertrouwde systemen er verbinding mee kunnen maken. In dit geval gebruiken we de standaard Ubuntu-firewall, UFW.
Vervolgens moeten we controleren of de firewall is geactiveerd. Als het niet actief is, moeten we het inschakelen.
root@host:~# ufw enable
Firewall is active and enabled on system startup
root@host:~#
Neo4j creëert twee netwerk sockets bij het installeren van de software. Eén op poort 7474 voor de HTTP-interface en één voor het primaire protocol op poort 7687. Neo4j raadt het gebruik van poort 7687 aan. De opdracht om een poort te openen zal vergelijkbaar zijn met de volgende opdracht die wordt gebruikt om een IPv4-adres toe te staan.
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
Voer uw specifieke netwerkbereik in om de poort te openen. Voor een IPv6-adres ziet de opdracht er als volgt uit.
ufw allow from fe80::1006:f7a3:b9cc:b0cb to any port 7687 proto tcp
De bovenstaande IP's worden als voorbeeld gebruikt. Vervang uw waarden en voeg een regel toe.
root@host:~# ufw allow from 192.168.50.189 to any port 7687 proto tcp
Rule added
root@host:~#
Herstart Firewall
Zorg ervoor dat u uw firewall opnieuw opstart.
root@host:~# ufw reload
Firewall reloaded
root@host:~#
Verbinding verifiëren
Laten we nu eens kijken of het correct werkt.
root@host:~# ufw status
Status: active
To Action From
-- ------ ----
7687/tcp ALLOW 192.168.50.189
root@host:~#
En daarmee hebben we een werkende Neo4j-server die klaar is voor gebruik en geconfigureerd om toegang op poort 7687 toe te staan.
Conclusie
We ontmoetten de grafische database van Neo4j, leerden hoe het werkt en waarom het nodig is. Stel een pakketbeheerder in en installeer vervolgens Neo4j. Vervolgens hebben we de functionaliteit gecontroleerd, erin gedoken en het wachtwoord gewijzigd. We hebben basisopdrachten geprobeerd voor het maken van een tabel, het maken van relaties en het instellen van knooppunten. Uiteindelijk hebben we de verbinding met de IP's geconfigureerd die we nodig hadden en een firewall geconfigureerd voor beveiliging.