Spanner Graph 查詢總覽

本文將概略說明如何搭配使用圖形查詢語言與 Spanner Graph,包括圖形模式比對的語法,並說明如何對圖形執行查詢。透過 Spanner Graph,您可以執行查詢來找出模式、遍歷關係,並從屬性圖形資料中取得洞察資訊。

本文中的範例會使用您在「設定及查詢 Spanner Graph」中建立的圖表結構定義。下圖說明這個結構:

Spanner 圖表結構定義範例。
圖 1.:Spanner 圖表結構定義範例。

執行 Spanner Graph 查詢

您可以使用 Google Cloud 控制台、Google Cloud CLI、用戶端程式庫、REST API 或 RPC API 執行 Spanner 圖形查詢。

Google Cloud 控制台

下列步驟說明如何在Google Cloud 控制台中執行查詢。這些步驟假設您有名為 test-instance 的執行個體,其中包含名為 example-db 的資料庫。如要瞭解如何建立含有資料庫的執行個體,請參閱設定及查詢 Spanner 圖表

  1. 前往 Google Cloud 控制台的「Spanner Instances」(Spanner 執行個體) 頁面。

    前往 Spanner 執行個體

  2. 按一下名為 test-instance 的執行個體。

  3. 在「資料庫」下方,按一下名為 example-db 的資料庫。

  4. 開啟 Spanner Studio,然後按一下「新增分頁」,或使用編輯器分頁。

  5. 在查詢編輯器中輸入查詢。

  6. 按一下「執行」

gcloud CLI

如要使用 gcloud CLI 指令列工具提交查詢,請執行下列步驟:

  1. 如果尚未安裝,請安裝 gcloud CLI

  2. 在 gcloud CLI 中執行下列指令:

    gcloud spanner databases execute-sql

詳情請參閱 Spanner CLI 快速入門導覽課程

REST API

如要使用 REST API 提交查詢,請使用下列任一指令:

詳情請參閱「使用 REST API 查詢資料」和「開始透過 REST 使用 Spanner」。

RPC API

如要使用 RPC API 提交查詢,請使用下列任一指令:

用戶端程式庫

如要進一步瞭解如何使用 Spanner 用戶端程式庫執行查詢,請參閱下列內容:

如要進一步瞭解 Spanner 用戶端程式庫,請參閱 Spanner 用戶端程式庫總覽

以視覺化方式呈現 Spanner Graph 查詢結果

您可以在 Google Cloud 控制台的 Spanner Studio 中,以視覺化方式呈現 Spanner 圖形查詢結果。查詢視覺化功能可顯示傳回的元素 (節點和邊緣) 如何連結。這有助於找出以表格形式呈現結果時難以發現的模式、依附元件和異常狀況。如要查看查詢的視覺化結果,查詢必須以 JSON 格式傳回完整節點。否則,您只能以表格格式查看查詢結果。詳情請參閱「使用 Spanner 圖形查詢視覺化功能」。

Spanner Graph 查詢結構

Spanner 圖形查詢包含多個元件,例如屬性圖形名稱、節點和邊緣模式,以及量詞。您可以使用這些元件建立查詢,在圖表中找出特定模式。本文的「圖形模式比對」一節會說明各個元件。

圖 2 中的查詢示範了 Spanner 圖形查詢的基本結構。查詢會先使用 GRAPH 子句指定目標圖表 FinGraphMATCH 子句接著會定義要搜尋的模式。在本例中,這是透過 Owns 邊緣連線至 Account 節點的 Person 節點。RETURN 子句指定要傳回相符節點的哪些屬性。

Spanner Graph 查詢結構範例。
圖 2.:Spanner Graph 查詢的結構範例。

圖形模式比對

圖表模式比對功能可找出圖表中的特定模式。最基本的模式是元素模式,例如比對節點的節點模式,以及比對邊緣的邊緣模式。

節點模式

節點模式會比對圖表中的節點。這個模式包含相符的半形括號,其中可能含有圖表模式變數、標籤運算式和屬性篩選器。

找出所有節點

下列查詢會傳回圖表中的所有節點。變數 n 是圖形模式變數,會繫結至相符的節點。在本例中,節點模式會比對圖表中的所有節點。

GRAPH FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;

這項查詢會傳回 labelid

標籤 id
帳戶 7
帳戶 16
帳戶 20
人物 1
人物 2
人物 3

找出具有特定標籤的所有節點

下列查詢會比對圖表中所有具有 Person 標籤的節點。查詢會傳回相符節點的 labelidname 屬性。

GRAPH FinGraph
MATCH (p:Person)
RETURN LABELS(p) AS label, p.id, p.name;

這項查詢會傳回相符節點的下列屬性:

標籤 id 名稱
人物 1 Alex
人物 2 Dana
人物 3 Lee

找出符合標籤運算式的節點

您可以使用一或多個邏輯運算子建立標籤運算式。舉例來說,下列查詢會比對圖表中的所有節點,這些節點具有 PersonAccount 標籤。圖形模式變數 n 會公開來自節點的所有屬性,並帶有 PersonAccount 標籤。

GRAPH FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;

在下列查詢結果中:

  • 所有節點都有 id 屬性。
  • 符合 Account 標籤的節點具有 create_time 屬性,但沒有 birthday 屬性。這些節點的 birthday 屬性為 NULL
  • 符合 Person 標籤的節點具有 birthday 屬性,但沒有 create_time 屬性。create_time 屬性是這些節點的 NULL
標籤 id 生日 create_time
帳戶 7 空值 2020-01-10T14:22:20.222Z
帳戶 16 空值 2020-01-28T01:55:09.206Z
帳戶 20 空值 2020-02-18T13:44:20.655Z
人物 1 1991-12-21T08:00:00Z 空值
人物 2 1980-10-31T08:00:00Z 空值
人物 3 1986-12-07T08:00:00Z 空值

找出符合標籤運算式和屬性篩選條件的所有節點

這項查詢會比對圖表中所有具有 Person 標籤的節點,且屬性 id 等於 1

GRAPH FinGraph
MATCH (p:Person {id: 1})
RETURN LABELS(p) AS label, p.id, p.name, p.birthday;

查詢結果如下:

標籤 id 名稱 生日
人物 1 Alex 1991-12-21T08:00:00Z

您可以使用 WHERE 子句,在標籤和屬性上形成更複雜的篩選條件。

下列查詢使用 WHERE 子句,在屬性上形成更複雜的篩選條件。這會比對圖形中具有 Person 標籤的所有節點,且屬性 birthday 位於 1990-01-10 之前。

GRAPH FinGraph
MATCH (p:Person WHERE p.birthday < '1990-01-10')
RETURN LABELS(p) AS label, p.name, p.birthday;

查詢結果如下:

標籤 名稱 生日
人物 Dana 1980-10-31T08:00:00Z
人物 Lee 1986-12-07T08:00:00Z

邊緣模式

邊緣模式會比對節點之間的邊緣或關係。邊緣模式會以方括號 ([]) 括住,並包含 --><- 等符號來表示方向。邊緣模式可以選擇性地包含圖形模式變數,以繫結至相符的邊緣。

找出所有標籤相符的邊緣

這項查詢會傳回圖表中所有具有 Transfers 標籤的邊緣。查詢會將圖形模式變數 e 繫結至相符的邊緣。

GRAPH FinGraph
MATCH -[e:Transfers]->
RETURN e.Id as src_account, e.order_number

查詢結果如下:

src_account order_number
7 304330008004315
7 304120005529714
16 103650009791820
20 304120005529714
20 302290001255747

找出符合標籤運算式和屬性篩選條件的所有邊緣

這項查詢的邊緣模式會使用標籤運算式和屬性篩選器,找出所有標示為 Transfers 且符合指定 order_number 的邊緣。

GRAPH FinGraph
MATCH -[e:Transfers {order_number: "304120005529714"}]->
RETURN e.Id AS src_account, e.order_number

查詢結果如下:

src_account order_number
7 304120005529714
20 304120005529714

使用任何方向的邊緣模式找出所有邊緣

您可以在查詢中使用 any direction 邊緣模式 (-[]-),比對任一方向的邊緣。下列查詢會找出所有帳戶遭封鎖的轉移作業。

GRAPH FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account {is_blocked:true})
RETURN transfer.order_number, transfer.amount;

查詢結果如下:

order_number amount
304330008004315 300
304120005529714 100
103650009791820 300
302290001255747 200

路徑模式

路徑模式是由交替的節點和邊緣模式建構而成。

使用路徑模式找出特定節點的所有路徑

以下查詢會找出所有從 Person 擁有的帳戶發起,且 id 等於 2 的帳戶轉移。

每個相符結果都代表從 Person {id: 2} 透過相連的 Account (使用 Owns 邊緣) 到另一個 Account (使用 Transfers 邊緣) 的路徑。

GRAPH FinGraph
MATCH
  (p:Person {id: 2})-[:Owns]->(account:Account)-[t:Transfers]->
  (to_account:Account)
RETURN
  p.id AS sender_id, account.id AS from_id, to_account.id AS to_id;

查詢結果如下:

sender_id from_id to_id
2 20 7
2 20 16

量化路徑模式

量化模式會在指定範圍內重複模式。

比對量化邊緣模式

如要尋找路徑長度不一的路徑,可以將量詞套用至邊緣模式。下列查詢會找出與來源 Account 相距一到三次轉移的目標帳戶,並以 7 做為 id

查詢會將量詞 {1, 3} 套用至邊緣模式 -[e:Transfers]->。這會指示查詢比對重複一、二或三次 Transfers 邊緣模式的路徑。WHERE 子句用於從結果中排除來源帳戶。ARRAY_LENGTH 函式用於存取 group variable e。詳情請參閱存取群組變數

GRAPH FinGraph
MATCH (src:Account {id: 7})-[e:Transfers]->{1, 3}(dst:Account)
WHERE src != dst
RETURN src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length, dst.id AS dst_account_id;

查詢結果如下:

src_account_id path_length dst_account_id
7 1 16
7 1 16
7 1 16
7 3 16
7 3 16
7 2 20
7 2 20

結果中的部分資料列重複。這是因為在相同來源和目的地節點之間,可能存在多個符合模式的路徑,而查詢會傳回所有路徑。

比對量化路徑模式

下列查詢會透過遭封鎖的中間帳戶,找出 Account 節點之間有一到兩個 Transfers 邊的節點。

括號中的路徑模式會經過量化,而其 WHERE 子句會指定重複模式的條件。

GRAPH FinGraph
MATCH
  (src:Account)
  ((a:Account)-[:Transfers]->(b:Account {is_blocked:true}) WHERE a != b){1,2}
    -[:Transfers]->(dst:Account)
RETURN src.id AS src_account_id, dst.id AS dst_account_id;

查詢結果如下:

src_account_id dst_account_id
7 20
7 20
20 20

群組變數

在量化模式中宣告的圖表模式變數,在該模式外存取時會變成群組變數。然後繫結至相符的圖形元素陣列。

您可以將群組變數視為陣列存取。系統會保留圖表元素,並按照這些元素在相符路徑中出現的順序排列。您可以使用水平匯總匯總群組變數。

存取群組變數

在以下範例中,變數 e 的存取方式如下:

  • 繫結至 WHERE 子句中單一邊緣的圖表模式變數,位於量化模式內時。e.amount > 100
  • ARRAY_LENGTH(e) 中繫結至邊緣元素陣列的群組變數,位於量化模式之外的 RETURN 陳述式中。
  • 繫結至邊緣元素陣列的群組變數,由量化模式外的 SUM(e.amount) 彙整。這是水平匯總的範例。
GRAPH FinGraph
MATCH
  (src:Account {id: 7})-[e:Transfers WHERE e.amount > 100]->{0,2}
  (dst:Account)
WHERE src.id != dst.id
LET total_amount = SUM(e.amount)
RETURN
  src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length,
  total_amount, dst.id AS dst_account_id;

查詢結果如下:

src_account_id path_length total_amount dst_account_id
7 1 300 16
7 2 600 20

路徑搜尋前置字串

如要限制共用來源和目的地節點的群組中相符的路徑,可以使用 ANYANY SHORTEST 路徑搜尋前置字串。您只能在整個路徑模式前套用這些前置字串,且無法在括號內套用。

使用 ANY 比對

以下查詢會找出與指定 Account 節點相距一或二個節點的所有可連線專屬帳戶。Transfers

ANY 路徑搜尋前置字串可確保查詢只會傳回一組不重複的 srcdst Account 節點之間的路徑。在下列範例中,雖然您可以透過兩個不同的路徑,從來源 Account 節點抵達 Account 節點,但查詢只會傳回一個路徑。{id: 16}

GRAPH FinGraph
MATCH ANY (src:Account {id: 7})-[e:Transfers]->{1,2}(dst:Account)
LET ids_in_path = ARRAY_CONCAT(ARRAY_AGG(e.Id), [dst.Id])
RETURN src.id AS src_account_id, dst.id AS dst_account_id, ids_in_path;

查詢結果如下:

src_account_id dst_account_id ids_in_path
7 16 7,16
7 20 7,16,20

圖形模式

圖表模式由一或多個路徑模式組成,並以半形逗號 (,) 分隔。圖表模式可以包含 WHERE 子句,方便您存取路徑模式中的所有圖表模式變數,以形成篩選條件。每個路徑模式都會產生路徑集合。

使用圖形模式比對

下列查詢會找出涉及交易金額超過 200 元的中介帳戶及其擁有者,這些帳戶會將資金從來源帳戶轉移至遭封鎖的帳戶。

下列路徑模式會形成圖表模式:

  • 第一個模式會找出路徑,其中轉移作業是透過中繼帳戶,從一個帳戶轉移至遭封鎖的帳戶。
  • 第二種模式會找出從帳戶到擁有者的路徑。

變數 interm 可做為兩個路徑模式之間的共同連結,因此 interm 必須在兩個路徑模式中參照相同的元素節點。這會根據 interm 變數建立等值聯結作業。

GRAPH FinGraph
MATCH
  (src:Account)-[t1:Transfers]->(interm:Account)-[t2:Transfers]->(dst:Account),
  (interm)<-[:Owns]-(p:Person)
WHERE dst.is_blocked = TRUE AND t1.amount > 200 AND t2.amount > 200
RETURN
  src.id AS src_account_id, dst.id AS dst_account_id,
  interm.id AS interm_account_id, p.id AS owner_id;

查詢結果如下:

src_account_id dst_account_id interm_account_id owner_id
20 16 7 1

線性查詢陳述式

您可以將多個圖形陳述式鏈結在一起,形成線性查詢陳述式。系統會按照查詢中的順序執行陳述式。

  • 每個陳述式都會將前一個陳述式的輸出做為輸入。第一個陳述式的輸入內容為空白。

  • 最後一個陳述式的輸出內容就是最終結果。

舉例來說,您可以使用線性查詢陳述式,找出轉移至遭封鎖帳戶的最高金額。下列查詢會找出帳戶,以及該帳戶中轉出至遭封鎖帳戶的轉移交易金額最大者。

GRAPH FinGraph
MATCH (src_account:Account)-[transfer:Transfers]->(dst_account:Account {is_blocked:true})
ORDER BY transfer.amount DESC
LIMIT 1
MATCH (src_account:Account)<-[owns:Owns]-(owner:Person)
RETURN src_account.id AS account_id, owner.name AS owner_name;

下表說明這個程序,顯示在每個陳述式之間傳遞的中間結果。為簡潔起見,這裡只顯示部分屬性。

陳述式 中繼結果 (簡短)
MATCH
  (src_account:Account)
    -[transfer:Transfers]->
  (dst_account:Account {is_blocked:true})
src_account 轉移 dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}

ORDER BY transfer.amount DESC
src_account 轉移 dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}

LIMIT 1
src_account 轉移 dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}

MATCH
  (src_account:Account)
    <-[owns:Owns]-
  (owner:Person)
src_account 轉移 dst_account 擁有 擁有者
{id: 7} {amount: 300.0} {id: 16, is_blocked: true} {person_id: 1, account_id: 7} {id: 1, name: Alex}
RETURN
  src_account.id AS account_id,
  owner.name AS owner_name
        
account_id owner_name
7 Alex

查詢結果如下:

account_id owner_name
7 Alex

回傳陳述式

RETURN 陳述式會指定要從相符模式傳回的內容。可存取圖形模式變數,並包含運算式和其他子句,例如 ORDER BYGROUP BY

Spanner Graph 不支援將圖形元素做為查詢結果傳回。如要傳回整個圖表元素,請使用 TO_JSON 函式SAFE_TO_JSON 函式。我們建議您使用這兩個函式中的 SAFE_TO_JSON

以 JSON 格式傳回圖表元素

GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Returning a graph element in the final results is NOT allowed. Instead, use
-- the TO_JSON function or explicitly return the graph element's properties.
RETURN TO_JSON(n) AS n;
GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Certain fields in the graph elements, such as TOKENLIST, can't be returned
-- in the TO_JSON function. In those cases, use the SAFE_TO_JSON function instead.
RETURN SAFE_TO_JSON(n) AS n;

查詢結果如下:

n
{"identifier":"mUZpbkdyYXBoLkFjY291bnQAeJEO","kind":"node","labels":["Account"],"properties":{"create_time":"2020-01-10T14:22:20.222Z","id":7,"is_blocked":false,"nick_name":"Vacation Fund"}}

使用 NEXT 關鍵字撰寫較長的查詢

您可以使用 NEXT 關鍵字,串連多個圖表線性查詢陳述式。第一個陳述式會收到空白輸入內容,後續每個陳述式的輸出內容則會成為下一個陳述式的輸入內容。

以下範例會透過串連多個圖表線性陳述式,找出收到最多轉入款項的帳戶擁有者。您可以使用相同的變數 (例如 account),在多個線性陳述式中參照相同的圖表元素。

GRAPH FinGraph
MATCH (:Account)-[:Transfers]->(account:Account)
RETURN account, COUNT(*) AS num_incoming_transfers
GROUP BY account
ORDER BY num_incoming_transfers DESC
LIMIT 1

NEXT

MATCH (account:Account)<-[:Owns]-(owner:Person)
RETURN account.id AS account_id, owner.name AS owner_name, num_incoming_transfers;

查詢結果如下:

account_id owner_name num_incoming_transfers
16 Lee 3

函式和運算式

您可以在 Spanner 圖形查詢中使用所有 GoogleSQL 函式 (包括匯總和純量函式)、運算子條件運算式。Spanner Graph 也支援圖形專屬的函式和運算子。

內建函式和運算子

GQL 中會使用下列函式運算子

  • PROPERTY_EXISTS(n, birthday):傳回 n 是否具有 birthday 屬性。
  • LABELS(n):傳回圖表結構定義中定義的 n 標籤。
  • PROPERTY_NAMES(n):傳回 n 的屬性名稱。
  • TO_JSON(n):以 JSON 格式傳回 n。詳情請參閱 TO_JSON 函式

PROPERTY_EXISTS 述詞、LABELS 函式和 TO_JSON 函式,以及 ARRAY_AGGCONCAT 等其他內建函式。

GRAPH FinGraph
MATCH (person:Person)-[:Owns]->(account:Account)
RETURN person, ARRAY_AGG(account.nick_name) AS accounts
GROUP BY person

NEXT

RETURN
  LABELS(person) AS labels,
  TO_JSON(person) AS person,
  accounts,
  CONCAT(person.city, ", ", person.country) AS location,
  PROPERTY_EXISTS(person, is_blocked) AS is_blocked_property_exists,
  PROPERTY_EXISTS(person, name) AS name_property_exists
LIMIT 1;

查詢結果如下:

is_blocked_property_exists name_property_exists 標籤 帳戶 位置 使用者圖示
false true Person ["Vacation Fund"] Adelaide, Australia {"identifier":"mUZpbkdyYXBoLlBlcnNvbgB4kQI=","kind":"node","labels":["Person"],"properties":{"birthday":"1991-12-21T08:00:00Z","city":"Adelaide","country":"Australia","id":1,"name":"Alex"}}

子查詢

「子查詢」是巢狀查詢,下列清單列出 Spanner 圖形子查詢規則:

  • 子查詢會以一組大括號 {} 括住。
  • 子查詢可能會以開頭的 GRAPH 子句開始,指定範圍內的圖形。指定的圖表不一定要與外部查詢中使用的圖表相同。
  • 如果子查詢中省略 GRAPH 子句,會發生下列情況:
    • 系統會從最接近的外部查詢內容推斷範圍內的圖表。
    • 子查詢必須從圖形模式比對陳述式開始,並使用 MATCH
  • 在子查詢範圍外宣告的圖表模式變數無法在子查詢內重複宣告,但可以在子查詢內的運算式或函式中參照。

使用子查詢找出每個帳戶的轉移總數

下列查詢說明如何使用 VALUE 子查詢。子查詢會以大括號 {} 括住,並以 VALUE 關鍵字做為前置字串。這項查詢會傳回帳戶啟動的轉移總數。

GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(account:Account)
RETURN p.name, account.id AS account_id, VALUE {
  MATCH (a:Account)-[transfer:Transfers]->(:Account)
  WHERE a = account
  RETURN COUNT(transfer) AS num_transfers
} AS num_transfers;

查詢結果如下:

名稱 account_id num_transfers
Alex 7 2
Dana 20 2
Lee 16 1

如需支援的子查詢運算式清單,請參閱「Spanner Graph 子查詢」。

使用子查詢找出每個人擁有的帳戶

下列查詢會搭配使用 CALL 陳述式和內嵌子查詢。MATCH (p:Person) 陳述式會建立名為 p 的單一資料欄。 這個表格中的每一列都包含 Person 節點。CALL (p) 陳述式會針對這個工作表中的每個資料列,執行隨附的子查詢。子查詢會找出每位相符人員擁有的帳戶 p。同一人的多個帳戶會依帳戶 ID 排序。

這個範例會從 MATCH (p:Person) 子句宣告外部範圍的節點變數 pCALL (p) 陳述式會參照這個變數。這項宣告可讓您在子查詢的路徑模式中重新宣告或多次宣告節點變數。這可確保內部和外部 p 節點變數會繫結至圖表中的相同 Person 節點。如果 CALL 陳述式未宣告節點變數 p,子查詢會將重新宣告的變數 p 視為新變數。這個新變數與外部範圍變數無關,且子查詢不會重複宣告,因為會傳回不同結果。詳情請參閱CALL聲明。

GRAPH FinGraph
MATCH (p:Person)
CALL (p) {
  MATCH (p)-[:Owns]->(a:Account)
  RETURN a.Id AS account_Id
  ORDER BY account_Id
}
RETURN p.name AS person_name, account_Id
ORDER BY person_name, account_Id;

結果

person_name account_Id
Alex 7
Dana 20
Lee 16

查詢參數

您可以使用參數查詢 Spanner Graph。詳情請參閱語法,並瞭解如何使用 Spanner 用戶端程式庫透過參數查詢資料

下列查詢說明如何使用查詢參數。

GRAPH FinGraph
MATCH (person:Person {id: @id})
RETURN person.name;

同時查詢圖表和表格

您可以搭配使用圖形查詢和 SQL,在單一陳述式中同時存取圖形和資料表的資訊。

GRAPH_TABLE 運算子會採用線性圖形查詢,並以表格形式傳回結果,可整合至 SQL 查詢。這項互通性可讓您使用非圖表內容擴充圖表查詢結果,反之亦然。

舉例來說,您可以建立 CreditReports 資料表並插入幾份信用報告,如下列範例所示:

CREATE TABLE CreditReports (
  person_id     INT64 NOT NULL,
  create_time   TIMESTAMP NOT NULL,
  score         INT64 NOT NULL,
) PRIMARY KEY (person_id, create_time);
INSERT INTO CreditReports (person_id, create_time, score)
VALUES
  (1,"2020-01-10 06:22:20.222", 700),
  (2,"2020-02-10 06:22:20.222", 800),
  (3,"2020-03-10 06:22:20.222", 750);

接著,您可以在 GRAPH_TABLE 中透過圖表模式比對找出特定人員,並將圖表查詢結果與 CreditReports 表格合併,以擷取信用評分。

SELECT
  gt.person.id,
  credit.score AS latest_credit_score
FROM GRAPH_TABLE(
  FinGraph
  MATCH (person:Person)-[:Owns]->(:Account)-[:Transfers]->(account:Account {is_blocked:true})
  RETURN DISTINCT person
) AS gt
JOIN CreditReports AS credit
  ON gt.person.id = credit.person_id
ORDER BY credit.create_time;

查詢結果如下:

person_id latest_credit_score
1 700
2 800

後續步驟

瞭解調整查詢的最佳做法