グラフデータベース

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

データベース

グラフデータベースとは

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

グラフモデル

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

RDB との比較

観点 グラフ DB RDB
関係の表現 エッジ (ネイティブ) 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 でクエリ
  • サーバーレスモード: 使用量に応じた課金

適するユースケース

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

グラフ DB が不向なケース

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

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

関連用語