Spanner Graph は、Spanner と Spanner Omni の機能です。これにより、Spanner 内でグラフ データベースを使用してプロパティ グラフを直接構築してクエリを実行できます。 Spanner Graph は、Spanner のスケーラビリティと信頼性をグラフのモデリングとクエリの機能と組み合わせたものです。
プロパティ グラフは、ノード(エンティティ)とエッジ(エンティティ間の関係)としてデータをモデル化します。どちらにもプロパティ(ラベルとメタデータ)を設定できます。これは、ソーシャル ネットワーク、不正検出、レコメンデーション エンジンなど、複雑で高度に接続されたデータに特に役立ちます。
このドキュメントのトピックは、Spanner に適用されるのと同じように Spanner Omni にも適用されます。
Spanner Graph を設定してクエリを実行する
Spanner Graph を使用するには、まず Spanner Omni のデプロイとデータベースを作成する必要があります。データベースを作成したら、既存の Spanner Omni テーブルをグラフのノードとエッジにマッピングするプロパティ グラフ スキーマを定義します。
スキーマを設定して基盤となるテーブルにデータを挿入したら、ISO GQL 標準を実装する GoogleSQL の拡張機能である Graph Query Language(GQL)を使用してグラフクエリを実行できます。詳細については、 Spanner Graph を設定してクエリを実行する をご覧ください。
Spanner Graph スキーマの概要
Spanner Graph スキーマは、リレーショナル データをグラフとして解釈します。スキーマは、グラフを構成するノードテーブルとエッジテーブルを指定します。各テーブルは、Spanner テーブルの行をグラフ要素にマッピングします。要素には、要素を分類するラベルと、属性を保存するプロパティを設定できます。詳細については、Spanner ドキュメントの スキーマの概要をご覧ください。
Spanner Graph スキーマの作成と管理
データ定義言語(DDL)ステートメントを使用して、プロパティ グラフ定義を作成、更新、削除します。CREATE PROPERTY GRAPH ステートメントは、基盤となるテーブル、キー、ラベルを指定してグラフを定義します。
詳細については、Spanner
ドキュメントの
Spanner Graph スキーマの作成と管理
をご覧ください。
スキーマ設計のベスト プラクティス
パフォーマンスには効率的なスキーマ設計が不可欠です。ベスト プラクティスとしては、次の例が挙げられます。
インターリーブを使用して、エッジをソースノードと同じ場所に配置する。
参照制約(外部キー)を使用して、グラフの整合性を確保する。
頻繁にフィルタされるプロパティにセカンダリ インデックスを作成する。
クエリパターンに基づいて、スキーマ化された設計とスキーマレス設計を選択する。
詳細については、Spanner ドキュメントの スキーマ設計のベスト プラクティス をご覧ください。
SQL ビューを使用してプロパティ グラフを作成する
SQL ビューを使用して、グラフのノードとエッジを定義できます。SQL ビューとテーブルを使用してグラフを作成する場合の違いについては、Spanner ドキュメントのテーブルではなくビューでグラフを作成するメリットをご覧ください。
SQL ビューから作成されたグラフの概要
ビューを抽象化レイヤとして使用すると、行レベルのアクセス制御、柔軟なデータ変換、スキーマレス データモデルから形式化されたデータモデルへのスムーズな移行が可能になります。詳細については、SQL ビューから作成されたグラフの概要をご覧ください。
SQL ビューからグラフを作成する
ビューからグラフを作成するには、標準 SQL を使用してビューを定義します。次に、CREATE PROPERTY GRAPH
ステートメントの NODE TABLES 句または EDGE TABLES
句で参照します。ビューベースの要素ごとに KEY を明示的に定義する必要があります。KEY
句は、各グラフ要素を一意に識別するソースビューの列を指定します。詳細については、Spanner ドキュメントの
SQL ビューからグラフを作成するをご覧ください。
Spanner Graph データを管理する
Spanner Graph でデータを管理するには、グラフを定義する基盤となるテーブルを変更します。詳細については、Spanner ドキュメントの Spanner Graph データを管理する をご覧ください。
| オペレーション | 説明 |
|---|---|
| 挿入 | INSERT ステートメントまたはミューテーション API を使用して、ノードテーブルとエッジテーブルに新しい行を追加します。 |
| 更新 | 基盤となるテーブルの対応する列を更新して、既存のプロパティを変更します。 |
| 削除 | 対応する行を削除して、ノードまたはエッジを削除します。ノードを削除するときに、関連するエッジを自動的に削除するには、ON DELETE CASCADE を使用します。 |
Spanner Graph クエリ
Spanner Graph は、グラフデータをトラバースして分析するクエリに Graph Query Language(GQL) をサポートしています。
クエリの概要
グラフクエリは、GRAPH 句を使用してターゲット グラフを指定し、MATCH
句を使用して検索するパターンを定義します。ノードとエッジのプロパティを返すことも、結果に対して集計を実行することもできます。詳細については、
Spanner ドキュメントのクエリの概要をご覧ください。
パスを操作する
パスは、グラフ内のノードとエッジのシーケンスを表します。2 つのノード間のすべてのパスを検索したり、最短パスを検索したり、PATH_LENGTH()、NODES()、EDGES()
などの関数を使用して、プロパティまたは長さに基づいてパスをフィルタしたりできます。詳細については、Spanner
ドキュメントの
パスを操作するをご覧ください。
クエリのチューニングのベスト プラクティス
グラフクエリを最適化するには:
カーディナリティの低いノードからトラバーサルを開始します。
すべてのノードとエッジのパターンにラベルを明示的に指定します。
IS_FIRST()関数を使用して、カーディナリティの高いスーパーノードからトラバースされるエッジの数を制限します。
詳細については、Spanner ドキュメントの クエリのチューニングのベスト プラクティス をご覧ください。
Spanner Graph で全文検索を使用する
Spanner Graph は Spanner の全文検索機能と統合されています。これにより、SEARCH()
関数を使用して、構造化されていないテキスト プロパティに基づいてノードまたはエッジを検索できます。詳細については、
Spanner
ドキュメントの Spanner Graph で全文検索を使用する
をご覧ください。
Spanner Graph でベクトル検索を使用する
グラフデータに対してベクトル類似検索を実行して、K 近傍法(KNN)または近似近傍法(ANN)を検索できます。これは、類似性に基づくレコメンデーションや AI ドリブン アプリケーションに役立ちます。詳細については、Spanner ドキュメントの Spanner Graph でベクトル検索を使用する をご覧ください。
Spanner Graph でスキーマレス データを管理する
データモデルが進化するアプリケーションの場合、Spanner Graph はスキーマレス
データの管理をサポートしています。すべてのノードとエッジを、プロパティの JSON 列を含む単一の汎用テーブルに保存できます。これにより、DDL を変更せずに新しい型と属性を追加できます。詳細については、Spanner ドキュメントの
Spanner Graph でスキーマレス データを管理する
をご覧ください。
Spanner Graph に移行する
既存のグラフデータを他のデータベースから Spanner Graph に移行できます。通常、このプロセスでは、データを CSV ファイルまたは JSON ファイルとしてエクスポートし、新しいプロパティ グラフをバックアップする Spanner テーブルにインポートします。詳細については、Spanner ドキュメントの データを Spanner Graph に移行する をご覧ください。
openCypher ユーザー向けの Spanner Graph リファレンス
openCypher の経験がある場合、Spanner Graph の GQL
実装は使い慣れたものですが、構文に違いがあります。
このリファレンスは、openCypher のコンセプトとクエリを Spanner Graph
の MATCH と RETURN のセマンティクスにマッピングするのに役立ちます。詳細については、
Spanner ドキュメントの
openCypher ユーザー向けの Spanner Graph リファレンス
をご覧ください。
Spanner Graph のトラブルシューティング
Spanner Graph でよくある問題としては、参照整合性の違反(ダングリング エッジ)やクエリの実行速度の低下などがあります。トラブルシューティングでは、スキーマ定義の検査、ノードまたはエッジの欠落の確認、クエリプランを使用したパフォーマンスのボトルネックの特定を行います。詳細については、 Spanner Graph のトラブルシューティングを Spanner ドキュメントでご覧ください。