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 の MATCH と RETURN のセマンティクスにマッピングする際に役立ちます。詳細については、Spanner ドキュメントの openCypher ユーザー向けの Spanner Graph リファレンスをご覧ください。

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

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

次のステップ