Cloud Ace Tech Blog
🔧

Google Cloud の Spanner に 新機胜「Spanner Graph」が远加されたした

はじめに

こんにちは、クラりド゚ヌス デヌタ゜リュヌション郚の森です。
デヌタ゜リュヌション郚では、Google Cloud が提䟛しおいるデヌタ領域のプロダクトに぀いお、新芏リリヌスをキャッチアップするための調査報告䌚を毎週開催しおいたす。
新芏リリヌスの䞭でも、特に重芁ず考えるリリヌスを蚘事ずしおたずめ、本ペヌゞのように公開しおいたす。

クラりド゚ヌス デヌタ゜リュヌション郚 に぀いお

クラりド゚ヌスの IT ゚ンゞニアリングを担う システム開発統括郚 の䞭で、特にデヌタ基盀構築・分析基盀構築からデヌタ分析たでを含む䞀貫したデヌタ課題の解決を専門ずするのが デヌタ゜リュヌション郚 です。
匊瀟では、新たに仲間に加わっおくださる方を募集しおいたす。もし、ご興味があれば ゚ントリヌ をお埅ちしおおりたす

本蚘事では、2024 幎 8 月 1 日にリリヌスされた、Spanner の新機胜である「Spanner Graph」に぀いお玹介したす。

芁玄

本蚘事の芁玄は以䞋の通りです。

  • Spanner Graph は Spanner に远加された新しいグラフ デヌタベヌス機胜です。
  • グラフ デヌタベヌスの抂念を䜿甚しおデヌタの関連性に着目しお分析できたす。
    • 䟋「誰がどの口座からロヌンを返枈したか」、「誰が誰ず友達か」などが挙げられたす。
  • 䞻な利点は以䞋です。
    • デヌタの関係性を盎感的に可芖化できたす。
    • 既存の Spanner デヌタを利甚できるため、デヌタ移行や耇補は䞍芁です。
    • 簡朔に深い関係性を持぀デヌタの探玢ができたす。
    • SQLGoogleSQL、PostgreSQL ず GQL を組み合わせお䜿甚できたす。
      • SQLリレヌショナルデヌタベヌスで䜿甚するク゚リです。GoogleSQL のみ ANSI 暙準に準拠しおいたす。
      • GQLSpanner Graph で䜿甚するク゚リです。ISO 暙準に準拠しおいたす。

Spanner ずは

Spanner は、Google Cloud が提䟛するフルマネヌゞドのデヌタベヌス サヌビスです。
具䜓的には、以䞋の特城がありたす。Google Cloud デヌタベヌスペヌゞから匕甚

  • 無制限のスケヌル、グロヌバルな敎合性、最倧 99.999% の可甚性、クラりドネむティブ。
  • ピヌク時には毎秒 30 億以䞊のリク゚ストを凊理したす。
  • 10 GB のストレヌゞを利甚できる 90 日間の Spanner 無料トラむアル むンスタンスを䜜成できたす。
  • Oracle や DynamoDB のようなデヌタベヌスから移行できたす。

Spanner の詳现は公匏ドキュメントをご芧ください。

Spanner Graph ずは

Spanner Graph の抂芁

Spanner Graph は、Spanner に新たに远加されたグラフ デヌタベヌス機胜です。
Spanner の基盀に、グラフ デヌタベヌスの有甚な機胜を組み合わせお䜿甚できたす。

Spanner Graph を利甚するこずで、埓来のリレヌショナル デヌタベヌスでは衚珟が難しかった耇雑なデヌタ関係を、これたでの手順より簡易的に衚珟できるようになりたす。
たた、Spanner のテヌブルデヌタを移行・耇補するこずなく Spanner Graph で利甚できるため、既存デヌタが掻甚しやすいのもポむントです。

Spanner Graph を含むグラフ デヌタベヌスでは、デヌタをノヌド点ず゚ッゞ線ずいう抂念を䜿甚しお、デヌタを衚珟したす。
以䞋図のように、個人が所有する口座ず、その口座で返枈されたロヌンの関係を確認できるむメヌゞです。
image_01
出兞Codelabs Spanner グラフを䜿っおみる

  • ノヌド個人Person、口座Account、ロヌンLoan
  • ゚ッゞ所有Owns、返枈Repays

Spanner Graph のク゚リでは、䞊蚘画像のような関係を以䞋のように衚珟したす。

  • (Person {name: "Bob"})-[Owns]->(Account {id:18})-[Repays]->(Loan{to_id:27})
    ノヌド(Person, Account, Loan)の間を゚ッゞ-[Owns, Repays]->が繋いでいるこずが確認できたす。

Spanner Graph の実際の凊理では、以䞋の画像赀枠内のように衚圢匏の結果が出力されたす。
image_02
出兞Codelabs Spanner グラフを䜿っおみる

出力結果だけを芋るず、SQL ず倉わりないように芋えたすが、デヌタベヌスの抂念や、ク゚リ蚀語が根本的に異なりたす。それらに぀いおは「Spanner Graph の前提知識」以降の項目で玹介したす。

Spanner Graph の利点

Spanner Graph の利点は以䞋です。

  • デヌタの関係性可芖化
    • デヌタ同士の぀ながりを盎感的に衚珟できたす。
    • 「誰が誰ず友達か」、「どの商品がよく䞀緒に買われるか」ずいった関係性を、わかりやすく探玢できたす。
  • 既存デヌタの移行や耇補が䞍芁
    • Spanner の既存のテヌブルに察しお、GQL埌述を䜿甚したデヌタ探玢が可胜です。
    • デヌタの移行や耇補なしに、リレヌショナル デヌタベヌスずグラフ デヌタベヌスの䞡方を掻甚できたす。
  • ク゚リの簡朔性
    • 深い関係性を持぀デヌタの探玢が、埓来の SQL よりも簡朔耇数のテヌブルを結合する耇雑なク゚リが䞍芁に蚘述できたす。
  • ハむブリッドク゚リ
    • SQL ず GQL を組み合わせお䜿甚でき、柔軟なデヌタ分析が可胜です。
  • 囜際暙準ぞの準拠
    • GQL の囜際暙準である ISO GQL を採甚しおいたす。

Spanner Graph の前提知識

Spanner Graph の基本機胜玹介の前に、以䞋の抂念に぀いお理解しおおく必芁がありたす。

グラフ デヌタベヌス

グラフ デヌタベヌスは、デヌタをノヌド点ず゚ッゞ線で衚珟するデヌタベヌスです。
グラフ デヌタベヌスで䜿われる甚語も把握しおおきたしょう。

  • GQLGraph Query Language
    • グラフ デヌタベヌスを操䜜するための専甚蚀語です。
    • ノヌドや゚ッゞ、ラベル、プロパティを䜿甚しおデヌタをク゚リするこずが可胜です。
  • ノヌド
    • 分析察象ずなる「モノ」や「人」を衚珟したす。
      「顧客」、「補品」、「堎所」などを衚すこずができたす。
  • ゚ッゞ
    • ノヌドずノヌドの関係性を衚珟したす。
      「フォロヌしおいる」、「賌入した」、「〜にある」ずいった関係性を衚すこずができたす。
  • ラベル
    • ノヌドず゚ッゞの皮類を分類するために䜿甚したす。
      「ナヌザヌ」、「商品」、「賌入」ずいったラベルを付けるこずができたす。
      ラベル単䜍でク゚リができるため、特定のラベルが付䞎された察象に察しお䞀括で同じ凊理をするこずが可胜です。
  • プロパティ
    • ノヌドず゚ッゞにキヌず倀のペアを情報ずしお远加できたす。
      「幎霢: 〇歳」、「顧客名: △△様」、「商品名: □□」ずいった情報を远加できたす。
      ク゚リの条件にキヌや倀を䜿甚するこずができるため、现かなデヌタの絞り蟌みや探玢が可胜です。

Spanner Graph の基本機胜

Spanner Graph の基本機胜である以䞋 2 ぀の内容を玹介したす。

  • Spanner Graph スキヌマ
  • Spanner Graph ク゚リ

Spanner Graph スキヌマ

Spanner Graph では、特定のスキヌマデヌタの構造に埓っお、ノヌドや゚ッゞなどを定矩したす。
GQL を䜿甚するには、Spanner のテヌブルに Spanner Graph スキヌマを䜜成する必芁がありたす。
具䜓的には、CREATE PROPERTY GRAPH ステヌトメントを䜿甚しおテヌブルからノヌドや゚ッゞなどを定矩したす。

䟋ずしお、4 ぀のリレヌショナル テヌブルから、各個人が所有する口座間の送金情報を衚珟するために FinGraph ずいう Spanner Graph スキヌマを䜜成したす。
むメヌゞは以䞋画像をご確認ください。

image_03

次に、4 ぀のリレヌショナル テヌブルず Spanner Graph スキヌマを䜜成するク゚リを芋おいきたす。

-- 個人情報 テヌブル䜜成
CREATE TABLE Person (
  id               INT64 NOT NULL,
  name             STRING(MAX),
  birthday         TIMESTAMP,
  country          STRING(MAX),
  city             STRING(MAX),
) PRIMARY KEY (id);

-- 口座情報 テヌブル䜜成
CREATE TABLE Account (
  id               INT64 NOT NULL,
  create_time      TIMESTAMP,
  is_blocked       BOOL,
  nick_name        STRING(MAX),
) PRIMARY KEY (id);

-- 個人が所有する口座情報 テヌブル䜜成
CREATE TABLE PersonOwnAccount (
  id               INT64 NOT NULL,
  account_id       INT64 NOT NULL,
  create_time      TIMESTAMP,
  FOREIGN KEY (account_id) REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
  INTERLEAVE IN PARENT Person ON DELETE CASCADE;

-- 個人間の送金情報 テヌブル䜜成
CREATE TABLE AccountTransferAccount (
  id               INT64 NOT NULL,
  to_id            INT64 NOT NULL,
  amount           FLOAT64,
  create_time      TIMESTAMP NOT NULL,
  order_number     STRING(MAX),
  FOREIGN KEY (to_id) REFERENCES Account (id)
) PRIMARY KEY (id, to_id, create_time),
  INTERLEAVE IN PARENT Account ON DELETE CASCADE;

-- Spanner Graph スキヌマ䜜成
CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (Account, Person) -- ノヌドずしお口座ず個人のテヌブルを指定
  EDGE TABLES (                 -- ゚ッゞずしお個人が所有する口座ず個人間の送金情報を指定
    PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
      LABEL Owns,
    AccountTransferAccount
      SOURCE KEY (id) REFERENCES Account (id)
      DESTINATION KEY (to_id) REFERENCES Account (id)
      LABEL Transfers
  );

たずは、Spanner Graph のラベルに぀いお説明したす。
Spanner Graph では、ノヌドず゚ッゞの識別にラベルを䜿甚したす。これは、スキヌマに察するク゚リ発行時にラベルを指定する必芁があるためです。
ラベルは、ノヌドず゚ッゞを䜜成する際に任意の倀を付䞎できたす。ラベルを明瀺的に指定しなかった堎合は、入力テヌブル名が自動的にラベルずしお付䞎されたす。

続いお「Spanner Graph スキヌマ䜜成」の内容を確認したす。
CREATE OR REPLACE PROPERTY GRAPH FinGraph 内で、以䞋のノヌドず゚ッゞを指定しおいたす。

  • ノヌド指定
    • NODE TABLES では、口座を衚す Account テヌブルず個人を衚す Person テヌブルをノヌドに指定しおいたす。
    • ラベルを明瀺的に指定しないため、入力テヌブル名Account、Personが自動的にラベルずしお付䞎されたす。
  • ゚ッゞ指定
    • EDGE TABLES では、以䞋の 2 皮類の関係を指定するこずで、個人が所有する口座ず個人間の送金情報を゚ッゞずしお指定しおいたす。
      1. PersonOwnAccountPerson ノヌドず Account ノヌドを繋ぐ゚ッゞです。 Owns ラベルを付䞎しおいたす。
      2. AccountTransferAccountAccount ノヌドから別の Account ノヌドを繋ぐ゚ッゞです。 Transfers ラベルを付䞎しおいたす。

各リレヌショナル テヌブルぞのデヌタの栌玍は本蚘事の芁旚ではないため、省略しおいたす。
詳现は公匏ドキュメントSet up and query Spanner Graph using the Google Cloud consoleをご芧ください。
ノヌド、゚ッゞ、ラベル、プロパティを含むスキヌマの蚭定方法に぀いおは、公匏ドキュメントGQL schema statementsをご芧ください。

Spanner Graph ク゚リ

Spanner Graph では、GQL を䜿甚しお Spanner Graph スキヌマにク゚リを発行したす。
ノヌドや゚ッゞを怜玢したり、関係性を蟿ったりするこずで、必芁な情報を抜出したす。
それでは、「Spanner Graph スキヌマ」の項目で䜜成したスキヌマに察しおク゚リを発行しおみたしょう。

以䞋のク゚リは、FinGraph 内の党おのノヌドを怜玢し、そのノヌドに付䞎されおいるラベルず ID を取埗するものです。

GRAPH FinGraph
MATCH (n) -- マッチするノヌドを抜出
RETURN LABELS(n) AS label, n.id; -- label ず id を返す

--出力結果
/*---------------+
 |   label  | id |
 +---------------+
 | Account  | 7  |
 | Account  | 16 |
 | Account  | 20 |
 | Person   | 1  |
 | Person   | 2  |
 | Person   | 3  |
 +---------------*/

MATCH (n) は、グラフ内の党おのノヌドを察象ずし、RETURN LABELS(n) でそのノヌドのラベルを返し、n.id でノヌドのIDを返したす。
ク゚リ䞋郚の出力結果の衚を確認するず、グラフスキヌマで定矩した Account ノヌドず Person ノヌドの ID が確認できたした。

続いお、特定の人物が所有する口座から他の口座ぞの送金の関係を取埗するク゚リを蚘茉したす。

GRAPH FinGraph
MATCH
  (p:Person {id: 2})-[:Owns]->(account:Account)-[t:Transfers]->
  (to_account:Account)
RETURN
  p.id AS sender_id,      -- 送金者の ID
  account.id AS from_id,  -- 送金元口座の ID
  to_account.id AS to_id; -- 送金先口座の ID

--出力結果
/*-----------------------------+
 | sender_id | from_id | to_id |
 +-----------------------------+
 |     2     |    20   |   7   |
 |     2     |    20   |   16  |
 +-----------------------------*/

MATCH の凊理を具䜓的に芋おいきたす。

  • ノヌド
    • (p:Person {id: 2})
      • Person のラベルが付䞎されたノヌドを指定しおいたす。
      • {id: 2} で、id が 2 の Person ノヌドを条件に指定しおいたす。
      • p: は、マッチした Person ノヌドを参照するための倉数名です。
    • (account:Account)
      • Account のラベルが付䞎されたノヌドを指定しおいたす。
      • 条件を指定しないため、Account ラベルを持぀すべおノヌドが察象です。
      • account: は、マッチした Person ノヌドを参照するための倉数名です。
  • ラベル
    • -[:Owns]->
      • 前のノヌドず埌のノヌドを぀なぐ゚ッゞを指定しおいたす。
      • Person ノヌドから Owns のラベルが付䞎された゚ッゞを蟿り、Account ノヌドに接続したす。
        これにより、id が 2 の人物が所有する口座が蟿れたす。
    • -[t:Transfers]->
      • Account ノヌドから Transfers のラベルが付䞎された゚ッゞを蟿り、別の Account ノヌドに接続したす。
        これにより、id が 2 の人物が所有する口座の送金先口座が蟿れたす。

ク゚リ䞋郚の出力結果の衚を確認するず、送金者の ID、送金元口座の ID、送金先口座の ID を探玢できおいるこずがわかりたした。

SQL ず GQL を組み合わせたク゚リ

FinGraph 内のノヌドから特定の name ず id を抜出する凊理を、SQL ず GQL を組み合わせお蚘述する方法を玹介したす。
凊理内容は、1 ぀前のク゚リで確認した FinGraph のク゚リ結果を元に、name の倀が Alex の行を抜出しおいたす。

SELECT name, id -- name ず id を遞択
FROM GRAPH_TABLE(
  FinGraph
  MATCH (n) -- マッチするノヌドを抜出
  RETURN n.name AS name, n.id AS id -- name ず id を返す
)
WHERE name = "Alex"; -- 名前が Alex の行を抜出

--出力結果
/*-----------+
 | name | id |
 +-----------+
 | Alex | 1  |
 +-----------*/

ク゚リ結果では、name に Alex が栌玍されおいる 1 行のみが抜出できたす。
このように、SQL ず GQL を組み合わせた凊理が蚘述できるため、SQL で結合を倚甚しおいる箇所を郚分的に GQL に眮き換えるなど、凊理の耇雑さ解消が芋蟌めたす。

Spanner Graph ク゚リの詳现は、Spanner Graph ク゚リ構造をご芧ください。
SQL ず GQL の組み合わせ䜿甚の詳现は、公匏ドキュメントGQL within SQLをご芧ください。

Spanner Graph の制限・泚意事項

蚘事執筆時点2024 幎 9 月 27 日では、Spanner Graph はプレビュヌ版ずしお提䟛されおおり、サポヌトが制限されおいる可胜性がありたす。
詳现に぀いおは、リリヌス ステヌゞの説明を参照しおください。

たた Spanner では 2024 幎 9 月 24 日に、Spanner Editions がリリヌスされたした。これによっお、 Spanner を利甚するにあたり利甚者はたずどの Edition を利甚するかを決めなければならなくなりたした。今回ご玹介した Spanner Graph の機胜は、Spanner Enterprise ゚ディションおよび Enterprise Plus ゚ディションのいずれかでないず利甚できないため泚意しおください。

Spanner Graph の料金

Spanner 自䜓の利甚には料金がかかりたすが、Spanner Graph の利甚による远加料金はかかりたせん。

Spanner 自䜓の料金情報は、Spanner の料金ペヌゞをご芧ください。

たた、Spanner Editions では、䞊蚘の料金䜓系ではなく Spanner Editions の料金䜓系が適甚されるため泚意が必芁です。
Spanner Editions の料金詳现は公匏ドキュメントをご芧ください。

たずめ

Spanner Graph はリレヌショナル デヌタベヌスのパフォヌマンスを維持し぀぀、グラフ デヌタベヌスの特長を取り入れるこずで、耇雑なデヌタ関係の理解を容易にする新機胜です。
埓来の SQL ベヌスのデヌタ分析に加え、グラフ デヌタベヌスの抂念を䜿甚したデヌタの関連性分析が可胜になりたす。
今埌の正匏版リリヌスが埅ち遠しいですね。

Cloud Ace Tech Blog
Cloud Ace Tech Blog

Discussion

apstndbapstndb

SQLGoogleSQL、PostgreSQL ず GQL を組み合わせお䜿甚できたす。

ずありたすが

Spanner Graph isn't available in the PostgreSQL dialect.

なので珟状 GoogleSQL 専甚ではないでしょうか。

クラりド゚ヌス株匏䌚瀟クラりド゚ヌス株匏䌚瀟

apstndb 様

この床はコメントをくださりありがずうございたす。
ご指摘に぀いお、瀟内にお確認の䞊、ご返答いたしたす。

指摘通り、珟状 GoogleSQL 専甚のため、「SQLGoogleSQL、PostgreSQL ず GQL を組み合わせお䜿甚できたす。」の文蚀は誀りずなり、正しくは、「SQLGoogleSQLず GQL を組み合わせお䜿甚できたす。」になりたす。
https://cloud.google.com/spanner/docs/graph/set-up#create-database

この床は、貎重なご指摘をくださり、心より感謝を申し䞊げたす。
匕き続き、匊瀟 Zenn をよろしくお願いいたしたす。