MongoDB Academy · レッスン

Neo4j のようなグラフデータベースを使う場面

レコメンデーションエンジン、詐欺検出、ナレッジグラフなど、Neo4j のネイティブなトラバーサルが MongoDB の $lookup の連鎖を上回るグラフ構造の課題を見極めます。

レッスン 4/413 ステップ

「Neo4j のようなグラフデータベースを使う場面」はCoddyKit上の無料MongoDB Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはMongoDB Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 MongoDB Academyコースには全4レッスンが含まれています。

グラフデータベースとは

グラフデータベースは、データをノード(エンティティ)とエッジ(エンティティ間の関係)として表現します。各エッジは、型と独自のプロパティを持つ第一級オブジェクトです。関係が外部キーや埋め込み参照によって暗黙的に表現されるリレーショナルデータベースやドキュメントデータベースとは異なり、グラフデータベースは関係を明示的な接続として保存します。そのため、データベースのサイズに関係なく、関係を 1 つたどる処理は一定時間で完了する、ホップごとの O(1) トラバーサルが可能です。

関係をたどる際の問題

ドキュメントデータベースやリレーショナルデータベースは、エンティティを検索する処理に適しています。たとえば、ID でユーザーを取得したり、ステータスで注文を検索したりする処理です。一方、関係をたどる処理は苦手です。たとえば、「過去 1 か月以内に、Alice と同じ商品を購入した Alice の友人の友人をすべて検索する」といった処理です。ホップごとに $lookup または JOIN が必要になります。3 ホップの深さになると、3 つのネストした 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)

典型的なグラフの用途:レコメンデーションエンジン

レコメンデーションシステムは、関係ネットワークのトラバーサルに依存しています。たとえば、「あなたが購入した商品を購入したユーザーが、ほかに購入した商品」を検索します。グラフでは、各購入をユーザーノードと商品ノードの間のエッジとして表現します。協調フィルタリングによるおすすめを検索する処理は、2 ホップのトラバーサルです。User → Product → (その Product を購入したほかの User)→(その User たちが購入したほかの Product)という流れです。Neo4j はこのようなトラバーサルを毎秒数百万件処理できます。MongoDB の $graphLookup でも実行できますが、規模が大きくなると性能が低下します。

// 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 ホップ以内でつながっているすべてのアカウントを検索する」といった処理です。取引時にリアルタイムで不正スコアを算出し、数百万の関連エンティティをミリ秒単位で横断検索できることは、MongoDB にはない Neo4j の本来の強みです。

// 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

ナレッジグラフ

ナレッジグラフは、エンティティとその意味的な関係をモデル化したものです。たとえば、Wikipedia の情報をグラフとして構造化したものが挙げられます。ナレッジグラフは、検索エンジンのエンティティ認識、AI アシスタントによる事実に基づく回答、企業のオントロジーなどに利用されています。グラフモデルは自然に適合します。Person knows Person、Person worksAt Company、Company isLocatedIn City、City isCapitalOf Country のように表現できます。このような意味的なつながりをたどる処理こそ、グラフデータベースが得意とするものです。

MongoDB の $graphLookup で十分な場合

すべてのグラフ問題に Neo4j が必要なわけではありません。MongoDB の $graphLookup は、次のようなツリーやグラフのトラバーサルを十分に処理できます。浅い階層(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
    }
  }
])

MongoDB ではなく Neo4j を選ぶ場合

次のような場合は Neo4j(または別のグラフデータベース)を選択します。深いマルチホップトラバーサルが中核機能である場合(ソーシャルネットワーク、ナレッジグラフ、不正検出など)。関係そのものが豊富なプロパティを持つ場合(たとえば、フォローした日時や相互フォローかどうかを保存する FOLLOWS エッジ)。高い同時実行数の下でも、グラフクエリがリアルタイムで結果を返す必要がある場合。または、ドメイン全体がエンティティ中心ではなく関係中心である場合です。ソーシャルメディア、アイデンティティグラフ、ネットワークトポロジ、依存関係グラフでは、Neo4j を検討してください。

ポリグロットパーシステンス:両方を使う

大規模なシステムの多くは、ポリグロットパーシステンスを採用し、用途ごとに異なるデータベースを使い分けています。たとえばソーシャルプラットフォームでは、ユーザープロフィールや投稿を MongoDB(豊富なドキュメントクエリ)、友人関係や興味関心のグラフを Neo4j(高速なトラバーサル)、セッションデータを Redis(サブミリ秒の検索)、分析データをカラム型ストアに保存できます。それぞれのデータベースが得意な処理を担当します。システム間の整合性管理は複雑になりますが、性能とスケーラビリティの向上によって、その複雑さが正当化されることは少なくありません。

MongoDB と Neo4j のデータモデル比較

MongoDB では、ソーシャル上の関係を follows コレクション内のドキュメントとしてモデル化し、followerId フィールドと followeeId フィールドを持たせます。Neo4j では、2 つの User ノードを直接接続する FOLLOWS エッジとして表現します。グラフモデルでは中間コレクションが不要になり、ポインターに基づく直接的なトラバーサルが可能になります。ユーザーのプロフィールデータを取得するにはドキュメントモデルが適しており、ソーシャル上のつながりをたどるにはグラフモデルが適しています。

// 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 クエリでは、エッジの型でマッチングし、エッジのプロパティで絞り込めるため、豊富な関係クエリを実現できます。これは、MongoDB の relationships コレクションに type フィールドを保存し、それを使って結合するよりも、はるかに自然な方法です。

// 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のようなグラフデータベースが、レコメンデーションエンジン、詐欺検出、ナレッジグラフなど、深い多段階のリレーションシップ走査に優れていることを学びました。MongoDBでは$lookupのチェーンが指数関数的に性能劣化する一方、Neo4jのCypher言語は、ドキュメントクエリ言語では実現できない方法でグラフパターンを宣言的に表現できます。また、ドキュメントデータにはMongoDBを、リレーションシップの走査にはNeo4jを使用するポリグロット永続化は、実運用で一般的なパターンです。次は総仕上げとして、実運用に対応できるMongoDBアプリケーションアーキテクチャを設計します。

無料で開始

AI チューターと学ぶ JavaScript — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「Neo4j のようなグラフデータベースを使う場面」レッスンは無料ですか?

はい。「Neo4j のようなグラフデータベースを使う場面」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、MongoDB Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 MongoDB Academyコースには全4レッスンが含まれています。

「Neo4j のようなグラフデータベースを使う場面」で何を学びますか?

レコメンデーションエンジン、詐欺検出、ナレッジグラフなど、Neo4j のネイティブなトラバーサルが MongoDB の $lookup の連鎖を上回るグラフ構造の課題を見極めます。 ブラウザで直接実行するハンズオンコードでMongoDB Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

MongoDB Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのMongoDB Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Neo4j のようなグラフデータベースを使う場面」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このMongoDB Academyレッスンでコードを書いて実行できますか?

はい。すべてのMongoDB Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. MongoDB と Redis:ドキュメントとキーバリューキャッシュ
  2. MongoDB と Cassandra:惑星規模の書き込み
  3. MongoDB と DynamoDB:クラウドネイティブなトレードオフ
  4. Neo4j のようなグラフデータベースを使う場面
← MongoDB Academyに戻る