Что такое 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 — отсюда быстрые обходы.
Проверьте себя
1. За что отвечает порт 7687 в Neo4j?
AВеб-интерфейс Neo4j Browser
BПротокол Bolt, по которому подключаются драйверы приложений
CРезервное копирование
DМетрики мониторинга
2. Какая редакция Neo4j даёт кластеризацию и ролевой доступ?
ACommunity
BEnterprise
CОбе одинаково
DТолько Aura Free
3. Что обеспечивает быстрый переход узел→соседи в хранилище Neo4j?
AПолное сканирование таблицы
BСвязи узла хранятся как двусвязный список, доступный прямо от узла (index-free adjacency)
CВнешний поисковый индекс на каждое ребро
DКэширование SQL-планов