Wprowadzenie
W tym samouczku zbadamy, czym jest Neo4j, do czego służy i jak jest zaimplementowany. Zainstalujemy i skonfigurujemy również instalację na serwerze Ubuntu 20.04. Neo4j to graficzna baza danych służąca do tworzenia relacji danych. Inne przykłady graficznych baz danych to:
- ArangoDB
- Grakn rdzeń
- Microsoft SQL Server 2017
- OrientDB
- Ponowny wykres
Co to jest Neo4j
Neo4j łączy dane tak, jak są one przechowywane, umożliwiając nam uruchamianie zapytań, o których nigdy wcześniej nie wiedzieliśmy ani o których nie myśleliśmy. Mówiąc prościej, Neo4j rejestruje relacje między węzłami danych, podczas gdy konwencjonalne relacyjne bazy danych używają kolumn i wierszy do przechowywania danych strukturalnych. Ponieważ każdy węzeł przechowuje odniesienia do wszystkich innych węzłów, z którymi jest połączony, Neo4j może kodować i wyszukiwać złożone relacje z minimalnym obciążeniem.
Neo Technology jest twórcą i twórcą oprogramowania o otwartym kodzie źródłowym Neo4j. Firma rozwija go od 2003 roku. Jest napisany w Javie i Scali, a kod źródłowy jest dostępny bezpłatnie na GitHub. Od 2015 roku jest uważany za najczęściej używany graficzny system zarządzania bazami danych używany obecnie. Neo4j wykorzystuje swój własny język zapytań o nazwie Cypher, ale zapytania mogą być również pisane w innych stylach, na przykład poprzez Java API.
Wymagania wstępne
W przypadku tej instalacji oprogramowanie wymaga następujących ustawień podstawowych.
- 8 GB pamięci RAM i czterordzeniowy serwer. Zalecane użycie to co najmniej 1 GB pamięci RAM i serwer jednordzeniowy.
- Ubuntu 20.04 system operacyjny
- Wszystkie polecenia są uruchamiane jako root. Jeśli jesteś zwykłym użytkownikiem, polecenia muszą być poprzedzone poleceniem sudo.
Instalacja Neo4j
Dodaj repozytorium
Ubuntu oficjalnie nie zawiera Neo4j w standardowym repozytorium pakietów. Dodamy źródło pakietu wskazujące lokalizację repozytorium Neo4j, następnie dodamy klucz GPG z Neo4j do weryfikacji, a następnie zainstalujemy samego Neo4j.
Zaczynamy od aktualizacji listy pakietów i samych pakietów.
root@host:~# apt update && apt -y upgrade
Dodaj dodatkowe oprogramowanie
W tym kroku zainstalujemy dodatkowy pakiet potrzebny do połączeń HTTPS. Ta aplikacja może być już domyślnie zainstalowana w systemie, ale nadal wymaga aktualizacji.
root@host:~# apt install apt-transport-https ca-certificates curl software-properties-common -y
apt-transport-https pakiet umożliwia korzystanie z https przez menedżera pakietów przy użyciu libapt-pkg biblioteka. Dzięki temu instalacja jest bezpieczna.
Zweryfikuj klucz bezpieczeństwa
Teraz dodajemy oficjalny klucz bezpieczeństwa dla repozytorium pakietów Neo4j. Ten klucz sprawdza i weryfikuje, co instalujesz, pochodzi z oficjalnego repozytorium.
root@host:~# curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | apt-key add -
OK
root@host:~#
Dodaj repozytorium
Dodaj oficjalne repozytorium Neo4j do listy menedżerów pakietów.
root@host:~# add-apt-repository "deb https://debian.neo4j.com stable 4.1"
Zainstaluj Neo4j
Podczas instalacji Neo4j i wszystkich jego zależności, należy pamiętać, że instalacja poprosi nas o zainstalowanie pakietów Java do pracy z Neo4j. Podczas instalacji naciśnij Y., aby zaakceptować instalację oprogramowania. Jeśli masz zainstalowaną Javę, instalator zrozumie i pominie ten krok.
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:~#
Uruchom usługę Neo4j
Po zainstalowaniu musimy włączyć go jako usługę 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:~#
Sprawdź stan Neo4j
Następnie sprawdzamy, czy wszystko działa zgodnie z oczekiwaniami.
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
Testuj połączenie z bazą danych
Ponieważ zainstalowaliśmy Neo4j i uruchomiliśmy go jako usługę, przetestujemy teraz połączenie z bazą danych i skonfigurujemy administratora.
Uwaga:Korzystamy z bezpłatnej wersji Neo4j Community Edition. Obsługuje jednoczesną pracę z tą samą bazą danych, ale nie obejmuje przypisywania ról i uprawnień użytkownikom.Praca z Neo4j
Aby wchodzić w interakcję z bazą danych, uruchomimy wewnętrzne narzędzie o nazwie cypher-shell do pracy z Neo4j. Gdy uruchomimy go po raz pierwszy, zostaniemy poproszeni o podanie użytkownika i hasła. Domyślna nazwa użytkownika to neo4j, a hasło to neo4j. Po pierwszym zalogowaniu zostaniesz poproszony o zmianę hasła na jedno z wybranych.
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>
Aby wyjść, użyj polecenia wyjścia.
neo4j@neo4j> exit
Bye!
root@host:~#
Dodaj węzły
Skonfigurujmy kilka przykładowych węzłów i zdefiniujmy relacje między nimi. Połącz za pomocą Cyphera
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>
Następnie dodajmy węzeł o nazwie Liquidweb oraz nazwiska współpracowników, którzy pracują dla tej firmy pod nazwą Margaret. Możemy to zrobić za pomocą polecenia CREATE, a składnia będzie następująca.
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>
Dodaj użytkowników
Dodajmy jeszcze kilku kolegów i połączmy ich z firmą, w której pracują, Liquidweb. Połączymy się za pomocą polecenia 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>
Utwórz relacje
Ponieważ Peter i Chris pracują w tym samym dziale i mają te same właściwości co węzły, utworzymy relację z kolumną nazwy.
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 - Wskazuje zgodność węzłów. W tym przypadku w ramach jednej firmy Liquidweb
- GDZIE - między wartościami
- UTWÓRZ - twórz i dodawaj
- POWRÓT – Powrót do bazy.
Teraz utwórz połączenie między Johnem i Chrisem, chociaż są w różnych działach, ale pracują nad tym samym projektem.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>
Wyświetl informacje
Teraz wyświetlimy wszystkie te dane i ich relacje za pomocą następującego zapytania.
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>
Otrzymaliśmy dane wyjściowe z następującymi relacjami PRZYJACIEL, które pokazują relację i następujące relacje danych między DZIAŁEM a PROJEKTEM.
Aby wyjść z szyfru, uruchom polecenie wyjścia.
neo4j@neo4j> :exit
Bye!
root@host:~#
Skonfiguruj bezpieczne zdalne połączenie z Neo4j
Nie zawsze będziemy mogli połączyć się z bazą danych z samego serwera. Jeśli chcemy skonfigurować aplikację do korzystania z Neo4j, będziemy musieli skonfigurować ją tak, aby bezpiecznie łączyła się z innymi serwerami. Ponadto powinniśmy skonfigurować zaporę sieciową, aby ograniczyć, które serwery mogą się łączyć z Neo4j.
Domyślnie Neo4j łączy się przez localhost (127.0.0.1 - localhost - przeznaczony do testowania aplikacji bez współpracy z innymi serwerami). Również praca Neo4j z localhost nie będzie otwarta dla publicznego dostępu do Internetu. Tylko użytkownicy z dostępem do sieci lokalnej będą mogli połączyć się z Neo4j.
Skonfiguruj Neo4j
Aby Neo4j mógł łączyć się z innymi serwerami, musimy zmienić ustawienia pliku konfiguracyjnego /etc/neo4j/neo4j.conf . Do tego zadania użyjemy edytora nano. Pamiętaj, jeśli nie jesteś rootem, użyj polecenia sudo.
root@host:~# nano /etc/neo4j/neo4j.conf
root@host:~#
Znajdź linię w sekcji Złącze sieciowe
#dbms.default_listen_address=0.0.0.0
Odkomentuj tę linię, usuwając symbol #, a następnie naciśnij Ctrl + S i Ctrl + X, aby zapisać i wyjść z edytora.
Wartość 0.0.0.0 wiąże Neo4j ze wszystkimi dostępnymi interfejsami sieciowymi IPv4. Możesz podać konkretny adres IP lub sieć, której serwery używają jako ścieżki danych. Możesz również skonfigurować go tak, aby używał interfejsów IPv6, ale jest wiele niuansów tego ustawienia. Zalecamy zapoznanie się z dokumentacją na oficjalnej stronie internetowej.
Skonfiguruj zaporę sieciową dla połączeń zdalnych
Aby skonfigurować oprogramowanie Neo4j do połączeń zdalnych, musimy skonfigurować firewall. Ograniczamy dostęp, aby tylko zaufane systemy mogły się z nim połączyć. W takim przypadku użyjemy domyślnej zapory Ubuntu, UFW.
Następnie musimy sprawdzić, czy zapora jest aktywna. Jeśli nie jest aktywny, musimy go włączyć.
root@host:~# ufw enable
Firewall is active and enabled on system startup
root@host:~#
Neo4j tworzy dwa gniazda sieciowe podczas instalacji oprogramowania. Jeden na porcie 7474 dla interfejsu HTTP, a drugi dla protokołu podstawowego na porcie 7687. Neo4j zaleca użycie portu 7687. Polecenie otwarcia portu będzie podobne do następującego polecenia używanego do zezwolenia na adres 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
Wprowadź określony zakres sieci, aby otworzyć port. W przypadku adresu IPv6 polecenie będzie wyglądać tak.
ufw allow from fe80::1006:f7a3:b9cc:b0cb to any port 7687 proto tcp
Powyższe adresy IP służą jako przykład. Zastąp swoje wartości i dodaj regułę.
root@host:~# ufw allow from 192.168.50.189 to any port 7687 proto tcp
Rule added
root@host:~#
Uruchom ponownie zaporę sieciową
Pamiętaj, aby ponownie uruchomić zaporę sieciową.
root@host:~# ufw reload
Firewall reloaded
root@host:~#
Zweryfikuj połączenie
Sprawdźmy teraz, czy działa poprawnie.
root@host:~# ufw status
Status: active
To Action From
-- ------ ----
7687/tcp ALLOW 192.168.50.189
root@host:~#
I dzięki temu mamy działający serwer Neo4j, który jest gotowy do pracy i skonfigurowany tak, aby umożliwić dostęp na porcie 7687.
Wniosek
Spotkaliśmy się z graficzną bazą danych Neo4j, dowiedzieliśmy się, jak działa i dlaczego jest potrzebna. Skonfiguruj menedżera pakietów, a następnie zainstaluj Neo4j. Następnie sprawdziliśmy funkcjonalność, weszliśmy w to i zmieniliśmy hasło. Wypróbowaliśmy podstawowe polecenia dotyczące tworzenia tabeli, tworzenia relacji i konfigurowania węzłów. Na koniec skonfigurowaliśmy połączenie z potrzebnymi adresami IP i skonfigurowaliśmy zaporę ogniową dla bezpieczeństwa.