Spanner Graph の概要

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 ドキュメントの 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 ドキュメントのクエリの概要をご覧ください。

パスを操作する

パスは、グラフ内のノードとエッジのシーケンスを表します。PATH_LENGTH()NODES()EDGES() などの関数を使用して、2 つのノード間のすべてのパスを見つけたり、最短パスを見つけたり、プロパティや長さに基づいてパスをフィルタしたりできます。詳細については、Spanner ドキュメントのパスの操作をご覧ください。

クエリのチューニングのベスト プラクティス

グラフクエリを最適化するには:

  • 低いカーディナリティのノードからトラバーサルを開始します。

  • すべてのノードパターンとエッジパターンにラベルを明示的に指定します。

  • IS_FIRST() 関数を使用して、カーディナリティの高いスーパーノードから走査されるエッジの数を制限します。

詳細については、Spanner ドキュメントのクエリを調整するためのベスト プラクティスをご覧ください。

Spanner Graph は Spanner の全文検索機能と統合されており、SEARCH() 関数を使用して非構造化テキスト プロパティに基づいてノードまたはエッジを検索できます。詳細については、Spanner ドキュメントの 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 の MATCHRETURN のセマンティクスにマッピングする際に役立ちます。詳細については、Spanner のドキュメントの openCypher ユーザー向けの Spanner Graph リファレンスをご覧ください。

Spanner Graph のトラブルシューティング

Spanner Graph の一般的な問題には、参照整合性違反(ぶら下がりエッジ)やクエリの実行速度の低下などがあります。トラブルシューティングでは、スキーマ定義の検査、ノードまたはエッジの欠落の確認、クエリプランを使用したパフォーマンスのボトルネックの特定を行います。詳細については、Spanner ドキュメントの Spanner Graph のトラブルシューティングをご覧ください。

次のステップ