グラフデータベース
ノード (エンティティ) とエッジ (関係) でデータを表現し、複雑な関係性のクエリに特化したデータベース
データベース
グラフデータベースとは
グラフデータベースは、データをノード (エンティティ) とエッジ (関係) で表現し、複雑な関係性のクエリに特化したデータベースである。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 が適切)
より深く学ぶには関連書籍が役立つ。