RedisGraph入門:線形代数ベースの仕組みと性能・運用ガイド
RedisGraph とは — 概要
RedisGraph は、Redis のモジュールとして提供されるグラフデータベース機能です。Redis の高速なインメモリ基盤の上に「プロパティグラフ(property graph)」モデルと Cypher ライクなクエリ言語を組み合わせ、パターンマッチングや経路探索を高速に実行できるよう設計されています。オープンソースで開発され、Redis の周辺エコシステム(クライアントや永続化、運用ツール)を活用できるのが特徴です。
基本概念:プロパティグラフと主要要素
- ノード(頂点):ラベル(例:Person)とプロパティ(key/value)を持ちます。
- リレーションシップ(エッジ):ノード間の有向(または無向)関係。タイプ(例:KNOWS)やプロパティを持てます。
- プロパティ:文字列、数値、ブールなどの値。ノード・エッジ両方に付与可能。
- クエリ言語:Cypher に近い文法(MATCH, CREATE, RETURN 等)を使い、パターンマッチングや経路検索を記述します。
内部アーキテクチャ(ストレージと実行エンジン)
RedisGraph の特徴的な点は、グラフを隣接行列や疎行列として内部表現し、線形代数的な操作でパターンマッチングを実行する点です。一般的なノード/エッジ走査中心の処理ではなく、行列の積や選択演算といった高効率な演算で検索を行うことで、大きなグラフに対しても高速なクエリ性能を出せるケースがあります。
このアプローチは GraphBLAS のような「グラフ処理を線形代数で表す」考え方に触発されたものです。実装上は Redis モジュール API を通して Redis サーバ内で動作し、データはモジュール内部で管理されます。Redis の永続化(RDB/AOF)やバックアップ機能に対しても対応しています。
主なコマンドとクエリ例
RedisGraph はモジュールコマンド群(GRAPH.QUERY, GRAPH.EXPLAIN, GRAPH.PROFILE, GRAPH.DELETE など)を提供します。基本的な操作例:
GRAPH.QUERY social "CREATE (:Person {name:'Alice', age:30}), (:Person {name:'Bob', age:25}), (a:Person {name:'Alice'})-[:KNOWS {since:2020}]->(b:Person {name:'Bob'})"
GRAPH.QUERY social "MATCH (p:Person)-[r:KNOWS]->(q:Person) RETURN p.name, q.name, r.since"
インデックス作成(ノードのプロパティを高速検索するため):
GRAPH.QUERY social "CREATE INDEX ON :Person(name)"
クエリ性能分析用に EXPLAIN/PROFILE を用いて実行計画や実行統計を確認できます。
性能面の特徴と運用上のポイント
- 高速性:インメモリかつ線形代数ベースの処理により、パターンマッチングや一部の探索処理が非常に高速です。
- メモリ効率:疎行列表現や圧縮表現を用いることで、単純なオブジェクト表現よりもメモリ効率が良い場合があります。ただし、完全にインメモリで動くため巨大データは大量のRAMを必要とします。
- インデックス:ノードのプロパティに対する正確一致インデックスを作成でき、これにより-MATCH-の起点を速くできます。全文検索など高度な検索は RediSearch など別モジュールとの併用が一般的です。
- 永続化とバックアップ:Redis の RDB/AOF を通じてデータの永続化が可能。モジュールデータもこれらに含まれます。
制約・注意点
- 分散シャーディング(クラスタリング):オープンソースの RedisGraph 自体はグラフを自動でシャードしてクエリを分散実行する仕組みを内蔵していない点に注意が必要です。大規模な分散運用やシャーディングは Redis Enterprise 製品側でのサポートや別途設計が必要になる場合があります。
- Cypher のサブセット:RedisGraph は Cypher に近い言語をサポートしますが、Neo4j のすべての拡張機能やプロシージャを網羅するわけではありません。複雑なクエリの互換性は事前に確認してください。
- メモリ依存:データは主にメモリ上に存在するため、扱えるグラフサイズは搭載メモリ量に強く依存します。ディスクオンリーな大規模分析向けの設計ではありません。
- 分析機能の範囲:基本的な最短経路やパス検索、集合的な集計は可能ですが、豊富なグラフアルゴリズム群を標準で備える専用のグラフ分析フレームワーク(例:GraphX、Neo4j の Graph Data Science)と比べると機能面で差があります。
導入・運用時の実務的なヒント
- インデックス設計:検索で頻繁に使うプロパティにはインデックスを作る。MATCH の起点をインデックス検索にすると大幅に高速化できます。
- クエリの最適化:不要な大規模のカルテシアン積を避け、MATCH 節で早めにフィルタをかける。EXPLAIN と PROFILE で実行計画とコストを解析する習慣をつけると良いです。
- データロード:大量データを入れる場合はバルクインポートツール(コミュニティツールや CSV→CREATE のバッチ)を活用する。逐次 INSERT より高速です。
- 監視と永続化:Redis の監視ツール(メモリ使用量、遅延、RDB/AOF の状態)を使って稼働状況を監視する。重要データは定期バックアップを取る。
ユースケース
- リアルタイムなソーシャルグラフ検索(友人推薦、フォロー関係のクエリ)
- 権限関係や依存関係の解決(アクセス制御、依存性解析)
- 知識グラフの一部(短い経路探索や属性付き関係の高速照会)
- サイバーセキュリティのパターンマッチング(アラート相関など)
まとめ
RedisGraph は「高速なインメモリ性能」と「Cypher ライクな使い勝手」を両立した Redis モジュール型のグラフデータベースです。疎行列・線形代数的な手法でパターンマッチングを高速化する点が設計上のコアですが、その反面でメモリ依存やクラスタリング面での注意点もあります。小〜中規模のリアルタイム検索用途や、Redis を既に導入している環境でグラフ機能を追加するケースに非常に適しています。大規模分散や高度なグラフ分析を要する場合は、要件に応じて Redis Enterprise や専用のグラフ分析ツールと組み合わせる検討が必要です。
参考文献
- RedisGraph — Redis Modules(公式ドキュメント)
- RedisGraph — GitHub リポジトリ
- RedisGraph OSS ドキュメント(旧ドキュメント)
- OpenCypher(Cypher 言語仕様)
- GraphBLAS(グラフを線形代数で扱うための考え方・標準)


