グラフデータベース

ノード (エンティティ) とエッジ (関係) でデータを表現し、複雑な関係性のクエリに特化したデータベース

データベース

グラフデータベースとは

グラフデータベースは、データをノード (エンティティ) とエッジ (関係) で表現し、複雑な関係性のクエリに特化したデータベースである。SNS の友達関係、レコメンデーション、不正検知、ナレッジグラフなど、「関係性」が重要なユースケースで威力を発揮する。

グラフモデル

グラフモデルを図で示す。

(Alice)──[FOLLOWS]──→(Bob)
  │                    │
  [LIKES]              [FOLLOWS]
  ↓                    ↓
(Post:123)           (Charlie)──[LIKES]──→(Post:456)
  • ノード: エンティティ (ユーザー、投稿、商品)
  • エッジ: 関係 (フォロー、いいね、購入)
  • プロパティ: ノードやエッジに付与する属性

RDB との比較

RDB との主な違いを以下に比較する。

観点グラフ DBRDB
関係の表現エッジ (ネイティブ)JOIN テーブル
多段階の関係クエリ高速 (インデックスフリー隣接)遅い (多段 JOIN)
スキーマ柔軟 (スキーマレス)固定 (テーブル定義)
集計クエリ苦手得意
適するケース関係性の探索構造化データの CRUD

RDB で「友達の友達の友達」を検索するには 3 段の JOIN が必要で、データ量が増えると極端に遅くなる。グラフ DB はエッジをたどるだけなので、関係の深さに関わらず高速だ。

クエリ言語

Cypher (Neo4j)

// Alice がフォローしている人がいいねした投稿を取得
MATCH (alice:User {name: 'Alice'})-[:FOLLOWS]->(friend)-[:LIKES]->(post:Post)
RETURN post.title, friend.name

Gremlin (Apache TinkerPop)

// 同じクエリを Gremlin で
g.V().has('User', 'name', 'Alice')
  .out('FOLLOWS')
  .out('LIKES')
  .hasLabel('Post')
  .values('title')

AWS Neptune

Amazon Neptune は、フルマネージドのグラフデータベースサービスで、Gremlin と SPARQL の両方をサポートする。

  • プロパティグラフ: Gremlin でクエリ
  • RDF グラフ: SPARQL でクエリ
  • サーバーレスモード: 使用量に応じた課金

適するユースケース

グラフ DB はエンティティ間の関係性が複雑で、関係を辿るクエリが頻繁に発生する場面で威力を発揮する。RDB では多段 JOIN が必要になるクエリも、グラフ DB ではノード間のエッジを辿るだけで高速に処理できる。

ユースケース具体例
SNSフォロー関係、友達の友達、共通の友達
レコメンデーション「この商品を買った人はこれも買っています」
不正検知不正アカウントのネットワーク分析
ナレッジグラフ概念間の関係性の管理
ネットワーク管理IT インフラの依存関係マッピング

グラフ DB が不向なケース

  • 単純な CRUD (RDB や DynamoDB で十分)
  • 大量データの集計・分析 (RDB や Redshift が適切)
  • 時系列データ (時系列 DB が適切)

より深く学ぶには関連書籍が役立つ。

この記事は役に立ちましたか?

関連用語

関連する記事