MongoDB Academy · Урок

Когда использовать графовую базу данных, например Neo4j

Учащиеся определят задачи, представимые в виде графа — рекомендательные системы, обнаружение мошенничества, графы знаний, — где собственный обход Neo4j превосходит цепочки $lookup в MongoDB.

Урок 4 из 413 шагов

«Когда использовать графовую базу данных, например 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 — локальная установка не требуется.

Все уроки этого курса

  1. MongoDB и Redis: документы и кэш «ключ-значение»
  2. MongoDB и Cassandra: запись в планетарном масштабе
  3. MongoDB и DynamoDB: компромиссы облачных технологий
  4. Когда использовать графовую базу данных, например Neo4j
← Назад к MongoDB Academy