Установка Neo4j на FreeBSD

Дмитрий Филатов
Neo4j - графовая база данных. Причём, в отличие от большинства графовых или мультимодельных баз данных, Neo4j действительно хранит данные в виде графа (native graph storage). Как по мне, это более оптимальное решение по сравнению со всякими triplestores.

Сейчас появляется много задач, которые удобно решать при помощи графовых баз данных. В общем-то, любые знания, наверное, можно представить в виде графа. Или вот самый простой пример: сопоставление файлов и ключевых слов. Одно ключевое слово может относиться к нескольким файлам, а один файл может иметь несколько ключевых слов - очевидный граф. В реляционную базу данных такое поместить можно, но сложно. Во всяком случае, мне показалось интересным начать использовать графовую базу данных для систематизации накопленных знаний. Я просмотрел описания множества графовых и мультимодельных БД (вроде OrientDB, ArangoDB, Cayley...), но остановился, в конечном итоге, на Neo4j: меня прельстили способ хранения информации (property graph, то есть, собственное хранилище, заточенное под графы, а не реляционная подложка; кстати, большинство таких БД хранят данные в оперативной памяти - in-memory database, я же искал БД, хранящую данные на диске - persistent database), обширное сообщество, качественная документация и добротный язык запросов (Cypher).

Один нюанс: у меня FreeBSD, и ни про какие убунты я даже слышать не хочу.

Neo4j написана на Java (это единственное, что меня, как сишника и юниксоида, отталкивает: я бы хотел иметь движок БД, написанный на чистом Си). Вроде бы, Java - средство создания кроссплатформенных приложений, и с запуском приложений на яве во фряшечке проблем быть не должно. К тому же - о, радость! - в портах FreeBSD есть Neo4j. Но... Уж очень старая версия. Поэтому, я решил попробовать запустить на FreeBSD последнюю версию Neo4j, взятую с официального сайта разработчика. На удивление, получилось. Вот мой рецепт.

На странице с описанием системных требований указана предпочтительная версия Java: OpenJDK 11. Ставим:

pkg install openjdk11

Затем, качаем последнюю версию Neo4j Community Server для Linux/Mac (https://neo4j.com/download-center/#community):

wget https://dist.neo4j.org/neo4j-community-4.3.6-unix.tar.gz

Распаковываем и перемещаем в /usr/local/etc (думаю, это лучший путь для такой программы):

tar -xvf neo4j-community-4.3.6-unix.tar.gz
mv neo4j-community-4.3.6 /usr/local/etc/neo4j

Всё. Оказывается, для начала этого достаточно. Можно проверить работоспособность, запустив такую команду:

/usr/local/etc/neo4j/bin/neo4j version

Должна отобразиться версия движка БД. Если отобразилась - значит, всё работает. Теперь неплохо бы настроить сервер, хотя бы вытащить его наружу, за localhost (мы же ставим БД на сервер и хотели бы иметь к ней доступ с других компьютеров). В файле:

ee /usr/local/etc/neo4j/conf/neo4j.conf

раскомментируем строку:

dbms.default_listen_address=0.0.0.0

Теперь сервер можно запустить командой:

/usr/local/etc/neo4j/bin/neo4j start

Вроде, неплохо. Но нам же нужно, чтобы при перезагрузке сервера база данных автоматически запускалась? Я решил пойти unix-путём и создать свой загрузочный скрипт (startup rc script). Переходим в каталог скриптов и создаём пустой файл для будущего загрузочного скрипта:

cd /etc/rc.d
touch neo4j

Открываем файл:

ee neo4j

и пишем в него текст скрипта:

#!/bin/sh

# PROVIDE: neo4j
# REQUIRE: NETWORKING
# KEYWORD: shutdown

. /etc/rc.subr

JAVA_HOME="/usr/local/"
export JAVA_HOME

name=neo4j
rcvar=$name_enable

start_cmd="/usr/local/etc/neo4j/bin/neo4j start"
stop_cmd="/usr/local/etc/neo4j/bin/neo4j stop"

run_rc_command "$1"

Мне пришлось добавить экспорт переменной JAVA_HOME, без неё Neo4j не хотел запускаться через загрузочный скрипт (вручную запускается спокойно). Я внимательно изучил содержимое скрипта /usr/local/etc/neo4j/bin/neo4j и увидел там место на 82 строке (версия 4.3.6), где определяется переменная, содержащая путь к java:

JAVACMD="$JAVA_HOME/bin/java"

Поскольку полностью путь к Java такой: /usr/local/bin/java, я взял недостающую часть (/usr/local) и экспортировал её в своём загрузочном скрипте. Ладно, теперь сделаем наш загрузочный скрипт исполняемым:

chmod +x neo4j

Добавим в rc.conf разрешающую строчку:

echo 'neo4j_enable="YES"' >> /etc/rc.conf

И запустим Neo4j:

service neo4j start

Должно сработать.

P.S. Не забудьте перед первым запуском Neo4j установить пароль для суперпользователя:

/usr/local/etc/neo4j/bin/neo4j-admin set-initial-password <ваш_пароль>
2021-10-27