Introduktion
I den här handledningen kommer vi att undersöka vad Neo4j är, vad den används till och hur den implementeras. Vi kommer även att installera och konfigurera installationen på en Ubuntu 20.04-server. Neo4j är en grafisk databas som används för att skapa datarelationer. Andra exempel på grafiska databaser inkluderar:
- ArangoDB
- Grakn Core
- Microsoft SQL Server 2017
- OrientDB
- RedisGraph
Vad är Neo4j
Neo4j kopplar ihop data när den lagras, vilket gör att vi kan köra frågor som vi aldrig visste eller tänkt på tidigare. Enkelt uttryckt registrerar Neo4j förhållandet mellan datanoder, medan konventionella relationsdatabaser använder kolumner och rader för att lagra strukturerad data. Eftersom varje nod lagrar referenser till alla andra noder som den är ansluten till, kan Neo4j koda och fråga komplexa relationer med minimal overhead.
Neo Technology är skaparen och utvecklaren av programvaran med öppen källkod Neo4j. Företaget har utvecklat det sedan 2003. Det är skrivet i Java och Scala, och källkoden är fritt tillgänglig på GitHub. Från och med 2015 anses det vara det mest använda grafiska databashanteringssystemet som används idag. Neo4j använder sitt eget frågespråk som heter Cypher, men frågor kan också skrivas i andra stilar, till exempel genom Java API.
Förutsättningar
För denna installation kräver programvaran följande grundinställningar.
- 8 GB RAM och en fyrkärnig server. Den rekommenderade användningen är minst 1 GB RAM och en enkelkärnig server.
- Ubuntu 20.04 OS
- Alla kommandon körs som root. Om du är en vanlig användare måste kommandon föregås av kommandot sudo.
Neo4j-installation
Lägg till arkiv
Ubuntu innehåller inte officiellt Neo4j i standardpaketförrådet. Vi lägger till paketkällan som pekar på platsen för Neo4j-förvaret, lägger sedan till GPG-nyckeln från Neo4j för verifiering och installerar sedan Neo4j själv.
Vi börjar med att uppdatera listan över paket och själva paketen.
root@host:~# apt update && apt -y upgrade
Lägg till ytterligare programvara
I det här steget kommer vi att installera ett extra paket som behövs för HTTPS-anslutningar. Denna applikation kan redan vara installerad som standard på systemet, men den behöver fortfarande uppdateras.
root@host:~# apt install apt-transport-https ca-certificates curl software-properties-common -y
apt-transport-https paketet möjliggör användning av https via pakethanteraren med libapt-pkg bibliotek. Detta håller installationen säker.
Verifiera säkerhetsnyckel
Nu lägger vi till den officiella säkerhetsnyckeln för Neo4j-paketförrådet. Den här nyckeln kontrollerar och verifierar att det du installerar kommer från det officiella arkivet.
root@host:~# curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | apt-key add -
OK
root@host:~#
Lägg till arkiv
Lägg till det officiella Neo4j-förrådet till pakethanterarens lista.
root@host:~# add-apt-repository "deb https://debian.neo4j.com stable 4.1"
Installera Neo4j
När du installerar Neo4j och alla dess beroenden är det viktigt att notera att installationen kommer att uppmana oss att installera Java-paket för att fungera med Neo4j. Under installationen, tryck på Y. för att acceptera denna programvaruinstallation. Om du har Java installerat kommer installationsprogrammet att förstå och hoppa över detta steg.
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:~#
Starta Neo4j-tjänsten
När vi har installerat det måste vi aktivera det som en neo4j.service-tjänst.
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:~#
Kontrollera Neo4j-status
Därefter verifierar vi att allt fungerar som förväntat.
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
Testa DB-anslutning
Eftersom vi installerade Neo4j och startade den som en tjänst kommer vi nu att testa databasanslutningen och konfigurera adminanvändaren.
Obs:Vi använder den kostnadsfria Community Edition Neo4j-versionen. Den stöder samtidigt arbete med samma databas, men inkluderar inte tilldelning av roller och behörigheter till användare.Arbeta med Neo4j
För att interagera med databasen kommer vi att starta det interna verktyget som heter cypher-shell för att arbeta med Neo4j. När vi först kör det kommer vi att bli ombedda att ange en användare och lösenord. Som standard är användarnamnet neo4j, och lösenordet är neo4j. Efter den första inloggningen kommer du att uppmanas att ändra lösenordet till ett av dina val.
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>
För att avsluta, använd kommandot exit.
neo4j@neo4j> exit
Bye!
root@host:~#
Lägg till noder
Låt oss sätta upp några exempelnoder och definiera relationer mellan dem. Anslut med 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>
Låt oss sedan lägga till en nod som heter Liquidweb och namnen på kollegor som arbetar för detta företag under namnet Margaret. Vi kan göra detta med kommandot CREATE, och syntaxen blir som följer.
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>
Lägg till användare
Låt oss lägga till några fler kollegor och länka dem till företaget de jobbar för, Liquidweb. Vi kommer att ansluta med kommandot FRIEND.
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>
Skapa relationer
Eftersom Peter och Chris arbetar på samma avdelning och har samma egenskaper som noder kommer vi att skapa en relation med namnkolumnen.
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 - Detta indikerar korrespondensen mellan noderna. I det här fallet inom ett företag Liquidweb
- WHERE - mellan värden
- SKAPA - skapa och lägg till
- RETURN - Återgå till basen.
Skapa nu en koppling mellan John och Chris, även om de är på olika avdelningar, men de arbetar med samma projekt.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>
Visa info
Nu kommer vi att visa all denna data och deras relationer med hjälp av följande fråga.
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>
Vi fick utdata med följande FRIEND-relationer, som visar relationen och följande datarelationer mellan DEPARTMENT och PROJECT.
För att avsluta cypher-skalet, kör kommandot exit.
neo4j@neo4j> :exit
Bye!
root@host:~#
Konfigurera en säker fjärranslutning till Neo4j
Vi kommer inte alltid att kunna ansluta till databasen från själva servern. Om vi vill konfigurera applikationen att använda Neo4j måste vi konfigurera den för att säkert ansluta till andra servrar. Dessutom bör vi konfigurera brandväggen för att begränsa vilka servrar som kan ansluta till Neo4j.
Som standard ansluter Neo4j via localhost (127.0.0.1 - localhost - avsedd för att testa applikationer utan att arbeta med andra servrar). Dessutom kommer arbetet med Neo4j från localhost inte att vara öppet för allmänheten till Internet. Endast användare med åtkomst till det lokala nätverket kommer att kunna ansluta till Neo4j.
Konfigurera Neo4j
För att Neo4j ska kunna ansluta till andra servrar måste vi ändra inställningarna för konfigurationsfilen /etc/neo4j/neo4j.conf . Vi kommer att använda nanoredigeraren för denna uppgift. Kom ihåg att om du inte är root, använd kommandot sudo.
root@host:~# nano /etc/neo4j/neo4j.conf
root@host:~#
Hitta raden i avsnittet Nätverksanslutning
#dbms.default_listen_address=0.0.0.0
Avkommentera den här raden genom att ta bort #-symbolen och tryck sedan på Ctrl + S och Ctrl + X för att spara och avsluta redigeraren.
Värdet 0.0.0.0 kommer att binda Neo4j till alla tillgängliga IPv4-nätverksgränssnitt. Du kan ange en specifik IP-adress eller nätverk som dina servrar använder som en datasökväg. Du kan också konfigurera den för att använda IPv6-gränssnitt, men det finns många nyanser i den inställningen. Vi rekommenderar att du läser dokumentationen på den officiella webbplatsen.
Konfigurera brandvägg för fjärranslutningar
För att konfigurera Neo4j-programvaran för fjärranslutningar måste vi konfigurera brandväggen. Vi begränsar åtkomsten så att endast betrodda system kan ansluta till den. I det här fallet kommer vi att använda Ubuntus standardbrandvägg, UFW.
Därefter måste vi kontrollera om brandväggen är aktiverad. Om det inte är aktivt måste vi aktivera det.
root@host:~# ufw enable
Firewall is active and enabled on system startup
root@host:~#
Neo4j skapar två nätverksuttag när programvaran installeras. En på port 7474 för HTTP-gränssnittet och en för det primära protokollet på port 7687. Neo4j rekommenderar att du använder port 7687. Kommandot för att öppna en port kommer att likna följande kommando som används för att tillåta en IPv4-adress.
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
Ange ditt specifika nätverksområde för att öppna porten. För en IPv6-adress kommer kommandot att se ut så här.
ufw allow from fe80::1006:f7a3:b9cc:b0cb to any port 7687 proto tcp
Ovanstående IP-adresser används som exempel. Byt ut dina värden och lägg till en regel.
root@host:~# ufw allow from 192.168.50.189 to any port 7687 proto tcp
Rule added
root@host:~#
Starta om brandväggen
Se till att starta om din brandvägg.
root@host:~# ufw reload
Firewall reloaded
root@host:~#
Verifiera anslutningen
Låt oss nu kontrollera om det fungerar korrekt.
root@host:~# ufw status
Status: active
To Action From
-- ------ ----
7687/tcp ALLOW 192.168.50.189
root@host:~#
Och med det har vi en fungerande Neo4j-server som är redo att gå och konfigurerad för att tillåta åtkomst på port 7687.
Slutsats
Vi träffade den grafiska databasen Neo4j, lärde oss hur den fungerar och varför den behövs. Sätt upp en pakethanterare och installerade sedan Neo4j. Därefter kontrollerade vi funktionaliteten, gick in i den och ändrade lösenordet. Vi provade grundläggande kommandon om hur man skapar en tabell, skapar relationer och ställer in noder. Till slut konfigurerade vi anslutningen till de IP-adresser vi behövde och konfigurerade en brandvägg för säkerhet.