Въведение
В този урок ще разгледаме какво представлява Neo4j, за какво се използва и как се прилага. Ние също така ще инсталираме и конфигурираме инсталацията на сървър на Ubuntu 20.04. Neo4j е графична база данни, използвана за създаване на връзки с данни. Други примери за графични бази данни включват:
- ArangoDB
- Grakn Core
- Microsoft SQL Server 2017
- OrientDB
- RedisGraph
Какво е Neo4j
Neo4j свързва данните, докато се съхраняват, което ни позволява да изпълняваме заявки, за които никога не сме знаели или мислили преди. Казано по-просто, Neo4j записва връзката между възлите на данни, докато конвенционалните релационни бази данни използват колони и редове за съхранение на структурирани данни. Тъй като всеки възел съхранява препратки към всички други възли, към които е свързан, Neo4j може да кодира и да заявява сложни връзки с минимални допълнителни разходи.
Neo Technology е създател и разработчик на софтуера с отворен код Neo4j. Компанията го разработва от 2003 г. Написан е на Java и Scala, а изходният код е свободно достъпен в GitHub. От 2015 г. тя се счита за най-използваната графична система за управление на база данни, която се използва днес. Neo4j използва собствен език за заявки, наречен Cypher, но заявките могат да бъдат написани и в други стилове, например чрез Java API.
Предварителни условия
За тази инсталация софтуерът изисква следните основни настройки.
- 8 GB RAM и четириядрен сървър. Като минимум препоръчителната употреба е 1 GB RAM и едноядрен сървър.
- Ubuntu 20.04 OS
- Всички команди се изпълняват като root. Ако сте обикновен потребител, командите трябва да бъдат предшествани от командата sudo.
Инсталация на Neo4j
Добавяне на хранилище
Ubuntu не съдържа официално Neo4j в стандартното хранилище на пакети. Ще добавим източника на пакета, насочващ към местоположението на хранилището на Neo4j, след това ще добавим GPG ключа от Neo4j за проверка, след което ще инсталираме самия Neo4j.
Започваме с актуализиране на списъка с пакети и самите пакети.
root@host:~# apt update && apt -y upgrade
Добавяне на допълнителен софтуер
В тази стъпка ще инсталираме допълнителен пакет, който е необходим за HTTPS връзки. Това приложение може вече да е инсталирано по подразбиране в системата, но те все още трябва да бъдат актуализирани.
root@host:~# apt install apt-transport-https ca-certificates curl software-properties-common -y
apt-transport-https пакет позволява използването на https чрез мениджъра на пакети с помощта на libapt-pkg библиотека. Това поддържа инсталацията сигурна.
Проверете ключа за сигурност
Сега добавяме официалния ключ за сигурност за хранилището на пакетите Neo4j. Този ключ за проверка и потвърждава, че това, което инсталирате, е от официалното хранилище.
root@host:~# curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | apt-key add -
OK
root@host:~#
Добавяне на хранилище
Добавете официалното хранилище Neo4j към списъка с мениджър на пакети.
root@host:~# add-apt-repository "deb https://debian.neo4j.com stable 4.1"
Инсталирайте Neo4j
Когато инсталирате Neo4j и всички негови зависимости, е важно да отбележим, че инсталацията ще ни подкани да инсталираме Java пакети, за да работим с Neo4j. По време на инсталацията натиснете Y., за да приемете тази инсталация на софтуера. Ако имате инсталирана Java, инсталаторът ще разбере и ще пропусне тази стъпка.
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:~#
Стартирайте услугата Neo4j
След като го инсталираме, трябва да го активираме като услуга 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:~#
Проверете състоянието на Neo4j
След това проверяваме дали всичко работи според очакванията.
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 връзка
Тъй като инсталирахме Neo4j и го стартирахме като услуга, сега ще тестваме връзката с базата данни и ще конфигурираме администраторския потребител.
Забележка:Използваме безплатната версия на Community Edition Neo4j. Той поддържа едновременна работа с една и съща база данни, но не включва присвояване на роли и разрешения на потребителите.Работа с Neo4j
За да взаимодействаме с базата данни, ще стартираме вътрешната помощна програма, наречена cypher-shell, за работа с Neo4j. Когато го стартираме за първи път, ще бъдем помолени да въведете потребител и парола. По подразбиране потребителското име е neo4j, а паролата е neo4j. След първото влизане ще бъдете подканени да промените паролата на една по ваш избор.
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>
За да излезете, използвайте командата exit.
neo4j@neo4j> exit
Bye!
root@host:~#
Добавяне на възли
Нека настроим някои примерни възли и да дефинираме връзките между тях. Свържете се с помощта на 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>
След това нека добавим възел, наречен Liquidweb, и имената на колегите, които работят за тази компания под името Margaret. Можем да направим това с помощта на командата CREATE и синтаксисът ще бъде както следва.
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>
Добавяне на потребители
Нека добавим още няколко колеги и ги свържем с компанията, за която работят, Liquidweb. Ще се свържем с командата 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>
Създаване на взаимоотношения
Тъй като Питър и Крис работят в един и същи отдел и имат същите свойства като възлите, ще създадем връзка с колоната с име.
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>
- СЪВТОРЕНИЕ – Това показва съответствието на възлите. В този случай в рамките на една компания Liquidweb
- КЪДЕ - между стойностите
- СЪЗДАВАНЕ - създаване и добавяне
- ВРЪЩАНЕ – Връщане в базата.
Сега създайте връзка между Джон и Крис, въпреки че са в различни отдели, но работят по един и същ проект.neo4j@neo4j> МАЧ (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>
Показване на информация
Сега ще покажем всички тези данни и техните връзки с помощта на следната заявка.
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>
Получихме изходните данни със следните връзки FRIEND, които показват връзката и следните връзки с данни между DEPARTMENT и PROJECT.
За да излезете от шифрованата обвивка, изпълнете командата exit.
neo4j@neo4j> :exit
Bye!
root@host:~#
Настройте сигурна отдалечена връзка към Neo4j
Не винаги ще можем да се свържем с базата данни от самия сървър. Ако искаме да конфигурираме приложението да използва Neo4j, ще трябва да го конфигурираме за сигурно свързване с други сървъри. Освен това трябва да конфигурираме защитната стена, за да ограничим кои сървъри могат да се свързват към Neo4j.
По подразбиране Neo4j се свързва чрез localhost (127.0.0.1 - localhost - предназначен за тестване на приложения без работа с други сървъри). Също така работата на Neo4j от localhost няма да бъде отворена за публичен достъп до Интернет. Само потребители с достъп до локалната мрежа ще могат да се свързват с Neo4j.
Конфигуриране на Neo4j
За да може Neo4j да се свърже с други сървъри, трябва да променим настройките на конфигурационния файл /etc/neo4j/neo4j.conf . Ще използваме нано редактора за тази задача. Не забравяйте, че ако не сте root, използвайте командата sudo.
root@host:~# nano /etc/neo4j/neo4j.conf
root@host:~#
Намерете реда в секцията Мрежов конектор
#dbms.default_listen_address=0.0.0.0
Декоментирайте този ред, като премахнете символа # и след това натиснете Ctrl + S и Ctrl + X, за да запазите и излезете от редактора.
Стойността 0.0.0.0 ще обвърже Neo4j с всички налични IPv4 мрежови интерфейси. Можете да поставите конкретен IP адрес или мрежа, която вашите сървъри използват като път за данни. Можете също да го конфигурирате да използва IPv6 интерфейси, но има много нюанси в тази настройка. Препоръчваме ви да прочетете документацията на официалния уебсайт.
Конфигуриране на защитна стена за отдалечени връзки
За да конфигурираме софтуера Neo4j за отдалечени връзки, трябва да конфигурираме защитната стена. Ние ограничаваме достъпа, така че само доверени системи да могат да се свързват с него. В този случай ще използваме защитната стена на Ubuntu по подразбиране, UFW.
След това трябва да проверим дали защитната стена е активирана. Ако не е активен, трябва да го активираме.
root@host:~# ufw enable
Firewall is active and enabled on system startup
root@host:~#
Neo4j създава два мрежови сокета при инсталиране на софтуера. Един на порт 7474 за HTTP интерфейса и този за основния протокол на порт 7687. Neo4j препоръчва използването на порт 7687. Командата за отваряне на порт ще бъде подобна на следната команда, използвана за разрешаване на 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
Въведете вашия конкретен мрежов диапазон, за да отворите порта. За IPv6 адрес командата ще изглежда така.
ufw allow from fe80::1006:f7a3:b9cc:b0cb to any port 7687 proto tcp
Горните IP адреси се използват като пример. Заменете стойностите си и добавете правило.
root@host:~# ufw allow from 192.168.50.189 to any port 7687 proto tcp
Rule added
root@host:~#
Рестартирайте защитната стена
Не забравяйте да рестартирате защитната си стена.
root@host:~# ufw reload
Firewall reloaded
root@host:~#
Проверете връзката
Сега нека проверим дали работи правилно.
root@host:~# ufw status
Status: active
To Action From
-- ------ ----
7687/tcp ALLOW 192.168.50.189
root@host:~#
И с това имаме работещ сървър Neo4j, който е готов за работа и конфигуриран да позволява достъп до порт 7687.
Заключение
Срещнахме се с графичната база данни Neo4j, научихме как работи и защо е необходима. Настройте мениджър на пакети и след това инсталирайте Neo4j. След това проверихме функционалността, влязохме в нея и променихме паролата. Изпробвахме основни команди за това как да създадем таблица, да създадем връзки и да настроим възли. В крайна сметка конфигурирахме връзката с IP адресите, от които се нуждаехме, и конфигурирахме защитна стена за сигурност.