Что такое Neo4j и как его поставить
Знакомимся с самой распространённой графовой базой и поднимаем локальный экземпляр тремя способами.
Neo4j — графовая СУБД на модели property graph с декларативным языком запросов Cypher, ACID-транзакциями и режимом сервера, к которому подключаются по протоколу Bolt.
Что это и почему именно Neo4j
Neo4j появился в 2007 году и стал де-факто стандартом графовых баз: на нём учатся, под него больше всего материалов, драйверов и инструментов. Он реализует модель property graph, которую мы разобрали, и предлагает Cypher — язык, в котором запрос выглядит почти как нарисованный граф. Есть бесплатная Community-редакция (одна машина, ядро возможностей) и платная Enterprise (кластеризация, ролевой доступ, расширенный мониторинг). Для обучения и большинства пет-проектов Community хватает с запасом.
Почему стоит начинать именно с Neo4j, а не с экзотики? Во-первых, его язык Cypher лёг в основу международного стандарта GQL — навык переносим. Во-вторых, у Neo4j огромная экосистема: официальные драйверы для Python, JavaScript, Java, Go и других языков, библиотека графовых алгоритмов, инструменты импорта данных, удобный браузер для обучения. В-третьих, Neo4j — это ACID-СУБД: транзакции честные, как в реляционной базе, а не «в конечном счёте согласованные». Для системы, где связи критичны (деньги, доступы, граф знаний), это важно — вы не получите граф в полусогласованном состоянии после сбоя.
Три способа запустить
Neo4j Desktop
Графическое приложение под Windows/macOS/Linux: ставит сервер, управляет базами, открывает Browser в один клик. Самый дружелюбный путь для новичка — скачать с neo4j.com, создать проект и нажать «Start».
Docker
Если вы уже знакомы с контейнерами, это самый быстрый и воспроизводимый способ:
docker run -d \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/secretpass \
neo4j:5Порт 7474 — это Neo4j Browser (веб-интерфейс), 7687 — протокол Bolt, по которому ходят драйверы и сам Browser. Логин по умолчанию neo4j, пароль мы задали в NEO4J_AUTH. Флаг -d запускает контейнер в фоне, а --name даёт ему имя, чтобы потом было удобно остановить (docker stop neo4j) или посмотреть логи. Чтобы данные не исчезли вместе с контейнером, на практике добавляют монтирование тома — например -v $PWD/neo4j-data:/data; без этого граф живёт только пока жив контейнер.
Neo4j Aura
Облачный управляемый Neo4j: ничего не ставить, есть бесплатный тариф AuraDB Free. Удобно, когда не хочется возиться с локальной инфраструктурой. Aura сама занимается резервными копиями, обновлениями и доступностью, а подключение идёт по защищённому варианту Bolt. Минус — бесплатный тариф ограничен по размеру графа и засыпает при простое, так что для тяжёлых учебных датасетов локальный Docker или Desktop часто удобнее.
Какой способ выбрать
Грубое правило такое. Если вы только знакомитесь и хотите минимум возни — берите Desktop: кнопка «Start» и всё работает. Если вы уже дружите с контейнерами и хотите воспроизводимое окружение, которое легко поднять и снести, — Docker. Если не хотите вообще ничего держать на своей машине и согласны на ограничения бесплатного тарифа — Aura. Все три дают один и тот же движок и один и тот же Cypher, так что навыки полностью переносятся между ними.
Как устроен сервер
Грубо архитектуру можно нарисовать так:
┌────────────┐ Bolt :7687 ┌───────────────────────────┐ │ Драйвер │ ────────────> │ Neo4j-сервер │ │ (Python/JS)│ │ ┌─────────────────────┐ │ │ │ │ │ Cypher-планировщик │ │ └────────────┘ │ └─────────┬───────────┘ │ ┌────────────┐ HTTP :7474 │ ▼ │ │ Browser │ ────────────> │ Графовый движок + диск │ └────────────┘ └───────────────────────────┘
Любой запрос — из Browser, из приложения через драйвер — это строка Cypher, которую планировщик превращает в план обхода, а движок исполняет на хранимом графе. То есть Browser — это просто ещё один клиент: всё, что вы научитесь делать в нём руками, ваше приложение позже сделает программно через тот же протокол.
Как работает под капотом
Neo4j хранит граф в наборе файлов хранилища (store files): отдельно записи узлов, отдельно записи связей, отдельно свойства. Записи фиксированного размера, поэтому к узлу с известным id можно обратиться прямой адресацией. Связи у узла образуют двусвязный список — именно это даёт ту самую безындексную смежность: от узла мгновенно доступны его рёбра. Сверху работает кэш страниц (page cache): горячая часть графа держится в памяти, и обходы идут по RAM.
Почему разделение хранилищ так важно? Запись узла фиксированного размера хранит не сами свойства, а указатель на первую запись свойства и указатель на первую связь. Значит, чтобы пройти от узла к соседу, движку достаточно прочитать пару фиксированных записей и перейти по ссылке — без перебора и без обращения к внешнему индексу. Эта «адресная арифметика» и есть инженерное воплощение index-free adjacency: id узла напрямую превращается в позицию его записи в файле. Отсюда же берётся практический совет по железу: для графов критичен объём оперативной памяти, чтобы page cache вмещал горячую часть графа — тогда обходы не упираются в диск.
Кроме хранилища, у Neo4j есть журнал транзакций (transaction log): прежде чем изменения попадут в основные файлы, они дописываются в журнал. Это даёт долговечность (durability) — после внезапного выключения база восстановит незавершённые транзакции из журнала. Тот же журнал лежит в основе резервного копирования и репликации в Enterprise-редакции.
Частые ошибки
- Путать порты.
7474— это веб-Browser (HTTP),7687— Bolt для драйверов. Приложение подключается на 7687, человек открывает 7474. - Забыть сменить пароль. При первом входе Neo4j требует задать пароль вместо дефолтного
neo4j. - Ждать кластер от Community. Кластеризация и ролевая модель — это Enterprise; для учёбы это не нужно.
Итоги
- Neo4j — самая популярная графовая СУБД на модели property graph с языком Cypher.
- Поднять можно через Desktop (просто), Docker (воспроизводимо) или Aura (облако, без установки).
- Порт
7474— Browser,7687— Bolt; драйверы ходят по Bolt. - Хранилище раздельное (узлы/связи/свойства) плюс page cache — отсюда быстрые обходы.