Когда использовать графовую базу данных, например Neo4j
Учащиеся определят задачи, представимые в виде графа — рекомендательные системы, обнаружение мошенничества, графы знаний, — где собственный обход Neo4j превосходит цепочки $lookup в MongoDB.
«Когда использовать графовую базу данных, например Neo4j» — бесплатный урок MongoDB Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения MongoDB Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс MongoDB Academy содержит 4 уроков всего.
Что такое графовая база данных
Графовая база данных представляет данные в виде узлов (сущностей) и рёбер (связей между сущностями). Каждое ребро является самостоятельным объектом с типом и собственными свойствами. В отличие от реляционных баз данных и баз данных документов, где связи задаются неявно внешними ключами или встроенными ссылками, графовые базы данных хранят связи как явные соединения с обходом за O(1) на каждое ребро — переход по связи занимает постоянное время независимо от размера базы данных.
Проблема обхода связей
Документные и реляционные базы данных оптимизированы для поиска сущностей: например, получения пользователя по ID или поиска заказов по статусу. Им сложно выполнять обход связей: «найти всех друзей друзей Alice, которые купили тот же товар, что и Alice, за последний месяц». Для каждого перехода требуется $lookup или JOIN. Три перехода в глубину означают три вложенных объединения. При 10 переходах по миллионам узлов производительность MongoDB экспоненциально снижается, тогда как производительность Neo4j остаётся стабильной.
// MongoDB: 3-hop traversal — three nested $lookup stages
db.users.aggregate([
{ $match: { _id: aliceId } },
{ $lookup: { from: 'follows', localField: '_id', foreignField: 'followerId', as: 'following' } },
{ $unwind: '$following' },
{ $lookup: { from: 'follows', localField: 'following.followeeId', foreignField: 'followerId', as: 'followingOfFollowing' } },
// Expensive and increasingly slow with scale
])Neo4j и язык запросов Cypher
Neo4j — самая популярная графовая база данных, использующая язык запросов Cypher — декларативный язык на основе шаблонов для обхода графов. Запрос Cypher описывает искомый шаблон графа с помощью обозначений в стиле ASCII-графики: узлы записываются как (), а связи — как -[]->. Механизм запросов эффективно находит все подграфы, соответствующие шаблону, используя собственную индексацию без индексов смежности.
// Cypher: find Alice's second-degree connections (friends of friends)
MATCH (alice:User { name: 'Alice' })
-[:FOLLOWS]->(:User)
-[:FOLLOWS]->(foaf:User)
WHERE NOT (alice)-[:FOLLOWS]->(foaf)
AND foaf <> alice
RETURN DISTINCT foaf.name, foaf.email
LIMIT 50
// This is O(connections traversed), not O(total users in DB)Классический сценарий для графов: рекомендательные системы
Рекомендательные системы зависят от обхода сетей связей: «пользователи, купившие то же, что и вы, также купили X». В графе каждая покупка является ребром между узлом пользователя и узлом товара. Поиск рекомендаций методом коллаборативной фильтрации — это обход на 2 перехода: Пользователь → Товар → (другие пользователи, купившие этот товар) → (другие товары, купленные этими пользователями). Neo4j обрабатывает миллионы таких обходов в секунду. $graphLookup в MongoDB тоже может выполнять эту задачу, но при масштабировании его производительность снижается.
// Cypher: collaborative filtering recommendation
MATCH (me:User { _id: 'alice123' })
-[:PURCHASED]->(p:Product)
<-[:PURCHASED]-(other:User)
-[:PURCHASED]->(rec:Product)
WHERE NOT (me)-[:PURCHASED]->(rec)
RETURN rec.name, COUNT(other) AS score
ORDER BY score DESC
LIMIT 10Обнаружение мошенничества с помощью анализа графов
Мошеннические группы часто используют общие идентификационные данные: несколько учётных записей используют один и тот же ID устройства, номер телефона, IP-адрес или платёжный адрес. Графовые базы данных отлично подходят для обнаружения таких групп за счёт обхода связей: «найти все учётные записи, связанные с этой подозрительной учётной записью общими атрибутами в пределах 3 переходов». Оценка мошенничества в реальном времени во время транзакции — запрос к графу с миллионами связанных сущностей, выполняемый за миллисекунды, — является сильной стороной Neo4j, с которой MongoDB не может сравниться.
// Cypher: find fraud ring (accounts sharing device/phone/address)
MATCH (suspect:Account { id: 'acc-999' })
-[:SHARES_DEVICE|SHARES_PHONE|SHARES_ADDRESS*1..3]-(related:Account)
WHERE related.status = 'active'
RETURN related.id, related.email
LIMIT 100Графы знаний
Граф знаний моделирует сущности и их семантические связи — например, информацию Википедии, представленную в виде графа. Графы знаний используются для распознавания сущностей поисковыми системами, предоставления фактических ответов ИИ-помощниками и создания корпоративных онтологий. Графовая модель естественным образом описывает такие связи: Person знает Person, Person worksAt Company, Company isLocatedIn City, City isCapitalOf Country. Обход таких семантических цепочек — именно то, для чего предназначены графовые базы данных.
Когда $graphLookup в MongoDB достаточно
Не для каждой задачи, связанной с графами, нужен Neo4j. $graphLookup в MongoDB достаточно хорошо обрабатывает обходы деревьев и графов в следующих случаях: неглубокие иерархии (менее 5–6 переходов); графы умеренного размера (от тысяч до нескольких миллионов узлов); и нечастые запросы на обход, допускающие более высокую задержку. Если запросы к графу являются второстепенной функцией приложения, в основном построенного на данных документов, хранение всего в MongoDB значительно упрощает стек.
// MongoDB $graphLookup: category hierarchy traversal
db.categories.aggregate([
{ $match: { _id: 1 } },
{
$graphLookup: {
from: 'categories',
startWith: '$_id',
connectFromField: '_id',
connectToField: 'parentId',
as: 'descendants',
maxDepth: 5
}
}
])Когда выбирать Neo4j вместо MongoDB
Выбирайте Neo4j (или другую графовую базу данных), если: глубокие обходы через множество переходов являются ключевой функцией (социальные сети, графы знаний, обнаружение мошенничества); сама связь содержит значимые свойства (например, ребро FOLLOWS хранит время подписки и информацию о взаимности); графовые запросы должны возвращать результаты в реальном времени при высокой конкурентной нагрузке; или вся предметная область ориентирована на связи, а не на сущности. Для социальных сетей, графов идентичности, топологии сетей и графов зависимостей выбирайте Neo4j.
Полиглотное хранение: использование нескольких баз данных
Многие крупные системы используют полиглотное хранение — разные базы данных для разных задач. Социальная платформа может хранить профили пользователей и публикации в MongoDB (богатые запросы к документам), графы дружбы и интересов в Neo4j (быстрый обход), данные сеансов в Redis (поиск за доли миллисекунды), а аналитику — в столбцовом хранилище. Каждая база данных выполняет задачу, для которой подходит лучше всего. Сложность заключается в обеспечении согласованности между системами, но выигрыш в производительности и масштабируемости часто оправдывает такой подход.
Сравнение моделей данных MongoDB и Neo4j
В MongoDB социальная связь моделируется как документ в коллекции follows с полями followerId и followeeId. В Neo4j это ребро FOLLOWS, напрямую соединяющее два узла User. Графовая модель устраняет промежуточную коллекцию и обеспечивает прямой обход по указателям. Документная модель лучше подходит для получения данных профиля пользователя, а графовая — для обхода его социальных связей.
// MongoDB: relationships as documents
{ _id: ObjectId(), followerId: ObjectId('alice'), followeeId: ObjectId('bob'), createdAt: new Date() }
// Neo4j Cypher equivalent:
// (alice:User)-[:FOLLOWS { createdAt: datetime() }]->(bob:User)
// Stored as direct pointer — no intermediate collection neededСвойства графов и типы связей
Графовые рёбра в Neo4j имеют тип (подобно метке) и могут иметь свойства. Социальный граф может содержать типы рёбер FOLLOWS, LIKES, PURCHASED и REVIEWED — каждый со своими свойствами. Запросы Cypher могут сопоставлять тип ребра и фильтровать по его свойствам, что позволяет выполнять содержательные запросы к связям. Это гораздо естественнее, чем хранить поле type в коллекции relationships MongoDB и выполнять по нему объединение.
// Cypher: find products purchased within the last 7 days by connections
MATCH (me:User { id: 'alice' })
-[:FOLLOWS*1..2]->(friend:User)
-[p:PURCHASED]->(prod:Product)
WHERE p.purchasedAt >= datetime() - duration('P7D')
RETURN prod.name, COUNT(friend) AS friendsBought
ORDER BY friendsBought DESC
LIMIT 5Быстрая проверка
Проверьте, насколько хорошо вы усвоили изложенные в этом уроке концепции MongoDB и баз данных NoSQL.
Итоги урока
В этом уроке вы узнали, что графовые базы данных, такие как Neo4j, превосходно справляются с глубокими обходами связей через множество переходов — в рекомендательных системах, при обнаружении мошенничества и в графах знаний, где цепочки $lookup в MongoDB экспоненциально теряют производительность; язык Cypher в Neo4j декларативно описывает шаблоны графов способом, недоступным для языков запросов к документам; а полиглотное хранение, при котором MongoDB используется для данных документов, а Neo4j — для обхода связей, является распространённым промышленным шаблоном. Далее мы перейдём к итоговой задаче: проектированию готовой к эксплуатации архитектуры приложения на MongoDB.
Изучай JavaScript с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Когда использовать графовую базу данных, например Neo4j» бесплатный?
Да — полный текст урока «Когда использовать графовую базу данных, например Neo4j» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс MongoDB Academy, подпишись на CoddyKit PRO. Курс MongoDB Academy содержит 4 уроков всего.
Чему я научусь в уроке «Когда использовать графовую базу данных, например Neo4j»?
Учащиеся определят задачи, представимые в виде графа — рекомендательные системы, обнаружение мошенничества, графы знаний, — где собственный обход Neo4j превосходит цепочки $lookup в MongoDB. Ты практикуешь MongoDB Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать MongoDB Academy?
Предыдущий опыт не требуется. MongoDB Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Когда использовать графовую базу данных, например Neo4j»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке MongoDB Academy?
Да. Каждый урок MongoDB Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- MongoDB и Redis: документы и кэш «ключ-значение»
- MongoDB и Cassandra: запись в планетарном масштабе
- MongoDB и DynamoDB: компромиссы облачных технологий
- Когда использовать графовую базу данных, например Neo4j