Как установить Neo4j на удаленный сервер

Neo4j — это графовая база данных, которая хранит отношения между узлами данных, в отличие от традиционных реляционных БД, которые для структурирования данных используют строки и столбцы. Поскольку каждый узел хранит ссылки на другие узлы, к которым он подключен, Neo4j может кодировать и запрашивать сложные отношения с минимальными издержками.

Требования

Чтобы следовать этому руководству, вам понадобится сервер Linux (мы используем Ubuntu 22.04), настроенный в соответствии с инструкциями по первоначальной настройке, включая пользователя sudo и брандмауэр.

1: Установка Neo4j

Официальные репозитории пакетов Ubuntu не содержат копии ядра базы данных Neo4j. Чтобы установить апстрим пакет из Neo4j, необходимо добавить ключ GPG (чтобы убедиться, что вы загружаете валидный пакет). Затем нужно будет добавить новый источник пакета, ведущий к репозиторию программного обеспечения Neo4j, и, наконец, установить пакет.

Для начала запустите следующую команду curl и направьте ее вывод в команду gpg –dearmor. Это преобразует загруженный ключ в формат, который apt может использовать для проверки пакетов:

curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key |sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg

Затем добавьте репозиторий Neo4j 4.1 в исходники APT системы:

echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable 4.1" | sudo tee -a /etc/apt/sources.list.d/neo4j.list

Часть [signed-by=/usr/share/keyrings/neo4j.gpg] позволяет менеджеру apt использовать ключ, который вы загрузили для подтверждения пакета и другой информации о neo4j.

Следующий шаг — обновить списки пакетов, а затем установить пакет Neo4j и все его зависимости. Это также загрузит и установит совместимый пакет Java, поэтому вы можете ввести Y, когда команда apt предложит вам установить все зависимости:

sudo apt update
sudo apt install neo4j

После завершения установки Neo4j должен запуститься. Однако при перезагрузке вашей системы он не запустится автоматически. Последний шаг настройки — включить Neo4j как сервис, а также запустить его:

sudo systemctl enable neo4j.service

Теперь запустите сервис, если он еще не запущен:

sudo systemctl start neo4j.service

После выполнения всех этих действий проверьте статус Neo4j с помощью команды systemctl:

sudo systemctl status neo4j.service

У вас должен получиться примерно такой результат:

neo4j.service - Neo4j Graph Database
     Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-04-29 15:01:36 UTC; 2s ago
   Main PID: 2053 (java)
      Tasks: 40 (limit: 38383)
     Memory: 658.1M
     CGroup: /system.slice/neo4j.service
. . .

В выводе будут и другие строки, но нам важно отметить выделенные строки – enabled и running. После того, как вы установили и запустили Neo4j, вы можете перейти к следующему разделу, который поможет вам подключиться к Neo4j, настроить учетные данные и вставить узлы в БД.

2: Подключение и настройка Neo4j

Теперь, когда база Neo4j установлена и настроена на автоматический запуск после любой перезагрузки, вы можете протестировать подключение к ней и настроить учетные данные администратора.

Для взаимодействия с Neo4j в командной строке используйте утилиту cypher-shell. Вызвать утилиту можно следующим образом:

cypher-shell

При первом вызове оболочки вы войдете в систему, используя стандартные учетные данные администратора neo4j (логин: neo4j, пароль: neo4j). После того, как вы пройдете аутентификацию, Neo4j предложит вам изменить пароль администратора:

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>

В этом примере вы видите строку ********************** — это замаскированная версия нового пароля. Выберите собственный надежный и запоминающийся пароль и обязательно запишите его в надежном месте. После того, как вы установите пароль, вы подключитесь к интерактивной командной строке neo4j@neo4j>, с помощью которой вы сможете взаимодействовать с базами данных Neo4j, вставляя и запрашивая узлы.

Примечание: Neo4j Community Edition может поддерживать только одну базу данных за раз. Кроме того, версия Community не включает возможность присваивать пользователям роли и привилегии, поэтому эти функции не включены в это руководство. Для получения дополнительной информации о функциях, поддерживаемых Community Edition, обратитесь к документации Neo4j.

Теперь, когда вы установили пароль администратора и протестировали подключение к Neo4j, выйдите из командной строки cypher-shell, набрав :exit:

:exit

После этого вы можете дополнительно настроить Neo4j для приема удаленных подключений.

3: Настройка удаленного доступа к Neo4j (опционально)

Если вы хотите включить Neo4j в более крупное приложение или среду, использующую несколько серверов, вам необходимо настроить его для приема соединений из других систем. В этом разделе вы настроите Neo4j для поддержки удаленных подключений, а также добавите правила брандмауэра, чтобы ограничить список систем, которые могут подключаться к вашему серверу Neo4j.

По умолчанию Neo4j настроен на прием соединений только с локального хоста (127.0.0.1 – его IP-адрес). Благодаря такой конфигурации сервер Neo4j не будет доступен в интернете – только пользователи, имеющие доступ к локальной системе, смогут взаимодействовать с вашей копией Neo4j.

Чтобы изменить сетевой сокет, который использует Neo4j, с localhost на тот, который смогут использовать другие системы, вам нужно будет отредактировать файл /etc/neo4j/neo4j.conf. Откройте конфиг в любом удобном редакторе и найдите параметр dbms.default_listen_address. В следующем примере для редактирования файла используется nano:

sudo nano /etc/neo4j/neo4j.conf

Найдите закомментированную строку #dbms.default_listen_address=0.0.0.0 и раскомментируйте ее, удалив символ # в начале строки.

. . .
#*****************************************************************
# Network connector configuration
#*****************************************************************

# With default configuration Neo4j only accepts local connections.
# To accept non-local connections, uncomment this line:
dbms.default_listen_address=0.0.0.0
. . .

По умолчанию значение 0.0.0.0 привязывает Neo4j ко всем доступным интерфейсам IPv4 в вашей системе, включая localhost. Если вы хотите ограничить Neo4j определенным IP-адресом, – например, IP-адресом частной сети, который ваши серверы используют для передачи данных, – укажите здесь IP-адрес, присвоенный интерфейсу этой сети.

Также можно настроить Neo4j для использования интерфейсов IPv6. Как и в случае с IPv4, вы можете просто установить значение default_listen_address для определенного адреса IPv6, который вы будете использовать для связи с Neo4j. Если вы хотите, чтобы Neo4j использовал только локальный адрес IPv6 для вашего сервера, укажите ::1, – это значение соответствует локальному хосту в нотации IPv6.

Когда вы закончите настройку стандартного IP-адреса, который Neo4j будет использовать для соединений, сохраните и закройте файл neo4j.conf.

Примечание: Если вы настроите Neo4j для поддержки IPv6-адреса, вы не сможете напрямую подключиться к Neo4j с помощью cypher-shell, используя IPv6-адрес. Вместо этого вам потребуется либо настроить DNS-имя, которое разрешается в IPv6-адрес, либо добавить запись в файл /etc/hosts удаленной системы, чтобы связать адрес с именем. Затем вы сможете использовать имя файла DNS или hosts для подключения к Neo4j с использованием IPv6 из вашей удаленной системы.

Например, серверу Neo4j с IPv6-адресом типа 2001:db8::1 требуется, чтобы удаленная подключающаяся система имела примерно такую запись /etc/hosts (где your_hostname – имя вашего хоста):

. . .
2001:db8::1 your_hostname

Затем вы подключитесь к серверу из удаленной системы, используя имя, которое вы указали. Это делается следующим образом:

cypher-shell -a 'neo4j://your_hostname:7687'

Если вы запретите Neo4j использовать адрес локального хоста IPv6 ::1, то вы сможете подключиться к нему локально на самом сервере Neo4j, используя предварительно настроенное имя ip6-localhost в файле /etc/hosts:

cypher-shell -a 'neo4j://ip6-localhost:7687'

Как только вы вызовете cypher-shell с URI подключения, вам будет предложено ввести имя пользователя и пароль, все как обычно.

Итак, вы настроили Neo4j на поддержку удаленных подключений. Теперь важно ограничить удаленный доступ, чтобы к БД могли подключаться только доверенные системы. Чтобы ограничить удаленный доступ к Neo4j, вы можете использовать стандартный брандмауэр вашей системы (в Ubuntu по умолчанию используется UFW). Если вы следовали мануалу по настройке сервера, UFW уже установлен и готов к работе.

Neo4j создает два сетевых сокета при стандартной установке: один на порту 7474 для встроенного интерфейса HTTP, второй – на порту 7687 для основного протокола bolt. Neo4j не рекомендует использовать порт HTTP в рабочей среде, поэтому создавайте правила брандмауэра только для порта 7687.

Чтобы открыть доверенному удаленному хосту доступа к интерфейсу bolt по IPv4, введите следующую команду:

sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp

Укажите IP-адрес доверенной удаленной системы, которую вы будете использовать для доступа к Neo4j, вместо 203.0.113.1.

Если вы хотите разрешить доступ ко всему сетевому диапазону, например к частной сети или сети передачи данных, используйте такое правило:

sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp

Опять же, не забудьте указать правильный адрес сети, которой нужен доступ к Neo4j, вместо 192.0.2.0/24.

Если вы хотите разрешить хостам удаленный доступ к Neo4j по IPv6, добавьте такое правило:

sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp

Укажите IPv6-адрес доверенной системы вместо адреса 2001:DB8::1/128.

Как и в случае с IPv4, вы также можете разрешить доступ к серверу Neo4j ряду адресов IPv6. Для этого создайте следующее правило UFW:

sudo ufw allow from 2001:DB8::/32 to any port 7687 proto tcp

Вместо условного сетевого диапазона 2001:DB8::/32 укажите свой доверенный сетевой диапазон.

После создания всех необходимых правил UFW перезапустите брандмауэр, чтобы правила вступили в силу:

sudo ufw reload

Вы можете просмотреть используемые в данный момент правила UFW с помощью команды ufw status. Запустите ее, чтобы убедиться, что указанные вами адреса или сети смогут получить доступ к Neo4j через порт 7687:

sudo ufw status

Вы должны получить примерно такой вывод:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
7687/tcp                   ALLOW       203.0.113.1

Теперь у доверенных серверов или сетей есть доступ к вашей БД Neo4j через порт 7687. В следующем разделе этого руководства вы узнаете, как добавить узлы в базу данных и определить отношения между ними.

4: Использование Neo4j

Чтобы начать работу с Neo4j, давайте добавим несколько простых условных узлов, а затем определим отношения между ними. Подключитесь к Neo4j с помощью cypher-shell.

cypher-shell

Примечание: Если вы настроили удаленный доступ в третьем разделе, подключитесь к Neo4j, указав URI, соответствующий адресу вашего сервера Neo4j. Например, если IP-адрес вашего сервера Neo4j 203.0.113.1, подключитесь к нему из удаленной системы следующим образом:

cypher-shell -a ‘neo4j://203.0.113.1:7687’

Вам будет предложено ввести имя пользователя и пароль.

Если вы используете IPv6, убедитесь, что в /etc/hosts есть запись с именем, как описано в разделе 3. Затем подключитесь к вашему серверу Neo4j из вашей удаленной системы с помощью такой команды:

cypher-shell -a ‘neo4j://your_hostname:7687’

Опять же, убедитесь, что your_hostname связано с IPv6-адресом вашего сервера Neo4j в файле /etc/hosts удаленной системы.

После того как вы вошли в Neo4j, используя свое имя пользователя и пароль, вы можете запрашивать и добавлять узлы и отношения в базу данных.

Для начала добавьте в Neo4j узел Great White shark. Следующая команда создаст узел типа Shark по имени Great White.

CREATE (:Shark {name: 'Great White'});

После запуска команды вы получите вывод:

0 rows available after 3 ms, consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels

Примечание: Подробное объяснение запросов команды cypher выходит за рамки данного руководства. Для получения подробной информации о синтаксисе этой команды обратитесь к официальному мануалу Neo4j.

Затем добавьте еще несколько записей и свяжите их, используя отношение, которое мы условно назовем FRIEND. Neo4j позволяет использовать произвольные имена для отношений, которые связывают узлы (если хотите, замените FRIEND любым другим именем, которое вы хотели бы использовать).

В следующем примере мы создадим еще три узла и свяжем их с помощью отношения FRIEND:

CREATE
(:Shark {name: 'Hammerhead'})-[:FRIEND]->
(:Shark {name: 'Sammy'})-[:FRIEND]->
(:Shark {name: 'Megalodon'});

В выводе будет указано, что в базу данных добавлено три новых узла:

. . .
Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels

Как мы уже говорили, Neo4j позволяет связывать узлы, используя произвольные имена для отношений, поэтому в дополнение к отношению FRIEND мы можем также связать пару узлов другим отношением.

К примеру, узлы Sammy и Megalodon принадлежат к общему отряду Lamniformes. Отношения могут иметь свойства точно так же, как и узлы. Создайте отношение ORDER со свойством name, которому присвоено значение Lamniformes (это упростит описание одного из отношений):

MATCH (a:Shark),(b:Shark)
WHERE a.name = 'Sammy' AND b.name = 'Megalodon'
CREATE (a)-[r:ORDER { name: 'Lamniformes' }]->(b)
RETURN type(r), r.name;

После добавления этого отношения вы должны получить следующий вывод:

+-------------------------+
| type(r) | r.name        |
+-------------------------+
| "ORDER" | "Lamniformes" |
+-------------------------+

1 row available after 2 ms, consumed after another 7 ms
Created 1 relationships, Set 1 properties

Затем добавьте связь SUPERORDER между Sammy и Hammerhead, учитывая их таксономические взаимоотношения. Присвойте отношениям свойство name со значением Selachimorpha:

MATCH (a:Shark),(b:Shark)
WHERE a.name = 'Sammy' AND b.name = 'Hammerhead'
CREATE (a)-[r:SUPERORDER { name: 'Selachimorpha'}]->(b)
RETURN type(r), r.name;

Вы получите результат, в котором указан тип отношений, а также имя, которое вы добавили в качестве описания этого отношения:

+--------------------------------+
| type(r)      | r.name          |
+--------------------------------+
| "SUPERORDER" | "Selachimorpha" |
+--------------------------------+

1 row available after 2 ms, consumed after another 8 ms
Created 1 relationships, Set 1 properties

Имея в Neo4j все эти узлы и отношения, запросите свои данные при помощи:

MATCH (a)-[r]->(b)
RETURN a.name,r,b.name
ORDER BY r;

Вы получите такой результат:

+---------------------------------------------------------------------+
| a.name       | r                                     | b.name       |
+---------------------------------------------------------------------+
| "Hammerhead" | [:FRIEND]                             | "Sammy"      |
| "Sammy"      | [:FRIEND]                             | "Megalodon"  |
| "Sammy"      | [:ORDER {name: "Lamniformes"}]        | "Megalodon"  |
| "Sammy"      | [:SUPERORDER {name: "Selachimorpha"}] | "Hammerhead" |
+---------------------------------------------------------------------+

4 rows available after 72 ms, consumed after another 1 ms

Вывод включает все отношения: FRIEND, ORDER и SUPERORDER.
Когда вы закончите добавлять узлы и исследовать отношения между ними, введите команду :exit, чтобы выйти из оболочки cypher-shell.

Итоги

Вы установили и настроили Neo4j на своем сервере, а также добавили данные в БД. Кроме того, вы узнали, как дополнительно настроить Neo4j для приема подключений от удаленных систем и защитили его с помощью UFW.

Если вы хотите узнать об использовании Neo4j и инструмента cypher больше, обратитесь к официальной документации Neo4j.

Tags: ,

Добавить комментарий