Источник
Wikipedia: Neo4j
История Neo4j, модель property graph и контекст применения графовых баз данных.
Официальный сайт
Neo4j
Документация, продуктовые возможности и современные сценарии использования графовой платформы.
Neo4j - графовая СУБД (property graph), оптимизированная под хранение и обход связей. В системном дизайне её выбирают, когда связи между сущностями становятся центральной частью продукта: рекомендации, anti-fraud, знания о домене и identity/authorization графы.
История и контекст
Идея графовой СУБД и первый публичный релиз
Проект Neo4j развивается из практической потребности хранить и обрабатывать связанные данные; первый публичный релиз появляется в 2007 году.
Рост production-применения
Neo4j закрепляется в сценариях рекомендаций, fraud detection и knowledge graph, где важно быстро проходить граф на несколько hops.
Cloud и кластерные практики
Развиваются облачные предложения и практики эксплуатации кластеров с разделением read/write трафика.
Graph + AI use cases
Расширяются сценарии hybrid graph/vector и интеграции с GenAI-пайплайнами для поиска связей и контекста.
Ключевые архитектурные элементы
Property Graph модель
Данные представлены как ноды, связи и свойства. Связи - first-class сущности, а не побочный эффект join-таблиц.
Cypher и pattern matching
Cypher оптимизирован для декларативного описания графовых паттернов и traversal-запросов с переменной глубиной.
Индексы и constraints
Уникальные ограничения и индексы помогают удерживать целостность данных и ускорять опорные точки traversal.
Кластер и роли узлов
Write-трафик маршрутизируется через leader, read-трафик можно масштабировать через follower/read replica.
Cypher, Pattern Matching и реляционная алгебра
Cypher-декларация графового паттерна может быть приведена к реляционной форме: цепочке JOIN, фильтрации (SELECT) и проекции (PROJECT). Ниже - пошаговая визуализация этого соответствия.
Cypher: pattern matching и реляционная алгебра
Один и тот же запрос можно читать как обход графа и как цепочку JOIN + SELECT + PROJECT над таблицами.
Графовый обход (pattern matching)
Стартуем с якорной ноды пользователя `u-1001` через точечный lookup.
SELECT в `Users` по `user_id = 'u-1001'`.
Эквивалент в таблицах
Users
| user_id | name |
|---|---|
| u-1001 | Alice |
| u-2042 | Bob |
| u-3007 | Carol |
Follows
| follower_id | followee_id |
|---|---|
| u-1001 | u-2042 |
| u-1001 | u-3007 |
Posts
| post_id | author_id | topic |
|---|---|---|
| p-501 | u-2042 | graph |
| p-777 | u-3007 | caching |
Cypher-запрос
MATCH (u:User {userId: "u-1001"})-[:FOLLOWS]->(f:User)-[:AUTHORED]->(p:Post)
WHERE p.topic = "graph"
RETURN DISTINCT p.postId, p.title;Эквивалентный SQL
SELECT DISTINCT p.post_id, p.title
FROM users u
JOIN follows f ON u.user_id = f.follower_id
JOIN posts p ON f.followee_id = p.author_id
WHERE u.user_id = 'u-1001'
AND p.topic = 'graph';Приведение к реляционной алгебре
PROJECT{p.post_id, p.title} (
SELECT{u.user_id='u-1001' AND p.topic='graph'} (
(Users u JOIN_{u.user_id=f.follower_id} Follows f)
JOIN_{f.followee_id=p.author_id} Posts p
)
)Как маппится модель
- Label ноды -> таблица сущности (`User`, `Post`).
- Тип связи -> таблица связей (`Follows`) или FK-колонка.
- Pattern expansion `()-[:REL]->()` -> `JOIN` по ключам.
- `WHERE` в Cypher -> операция `SELECT`, `RETURN` -> `PROJECT` (и `DISTINCT` при необходимости).
High-Level Architecture
Ниже high-level контур Neo4j в продуктовой системе: слой приложений, Cypher execution path, графовое хранение с индексами и кластерные механики для read/write нагрузки.
System view
Neo4j is typically used as a graph-native operational store when relationships and multi-hop traversals are first-class requirements.
Graph-native patterns
Consistency and integrity
System design fit
Read / Write Path через компоненты
Диаграмма объединяет write и read path с пояснениями: как Cypher-запросы маршрутизируются, выполняются и становятся видимыми клиенту в кластере Neo4j.
Read/Write Path Explorer
Интерактивный разбор прохождения Cypher-запросов через компоненты Neo4j.
Write path
- Приложение отправляет Cypher write-команду на Neo4j endpoint (Bolt/HTTP).
- Роутер кластера направляет запись на leader, чтобы сохранить сериализуемый порядок коммитов.
- Leader выполняет запрос, пишет tx log и реплицирует изменения через Raft на followers.
- После подтверждения кворума транзакция коммитится, индексы и cache отражают новое состояние.
Когда выбирать Neo4j
Хорошо подходит
- Системы с высокой плотностью связей: social graph, рекомендации, fraud/risk analysis.
- Knowledge graph и GraphRAG-сценарии, где важны связи и explainability.
- Запросы с многошаговым traversal (1..N hops), которые дорого делать через SQL join-цепочки.
- Домены, где модель связей часто эволюционирует и нужна гибкость схемы.
Стоит избегать
- Простые CRUD-сценарии без сложных связей и графовых обходов.
- Чисто аналитические OLAP-нагрузки на огромных колонночных датасетах.
- Системы, где команда не готова к graph modeling и профилированию traversal-запросов.
- Сценарии, где основной bottleneck - массовые append-only логи, а не связи между сущностями.
Практика: DDL и DML
Ниже практические примеры Cypher-команд: от constraints/indexes (DDL) до MERGE/MATCH traversal-запросов (DML).
Примеры DDL и DML в Neo4j
DDL управляет ограничениями и индексами, DML моделирует граф и выполняет traversal-запросы.
DDL в Neo4j задает структурные гарантии и ускоряет чтение: uniqueness constraints, range/full-text индексы.
Уникальность бизнес-ключа для User
Cypher: CREATE CONSTRAINTГарантирует целостность графа и предотвращает дубли для userId.
CREATE CONSTRAINT user_id_unique IF NOT EXISTS
FOR (u:User)
REQUIRE u.userId IS UNIQUE;Range index для частых фильтров по дате
Cypher: CREATE RANGE INDEXУскоряет фильтрацию и сортировку по createdAt.
CREATE RANGE INDEX post_created_at_idx IF NOT EXISTS
FOR (p:Post)
ON (p.createdAt);Full-text индекс для контентного поиска
Cypher: CREATE FULLTEXT INDEXКомбинирует graph traversal с полнотекстовым поиском по title/body.
CREATE FULLTEXT INDEX post_content_ft IF NOT EXISTS
FOR (p:Post)
ON EACH [p.title, p.body];