建立及查詢圖表

本文說明如何使用 BigQuery Graph建立含有財務資訊的圖表,並使用 Graph Query Language (GQL) 執行圖表查詢。

必要的角色

如要取得建立及查詢圖表所需的權限,請要求管理員授予您「BigQuery 資料編輯者 」(roles/bigquery.dataEditor) IAM 角色,以便在資料集中建立節點資料表、邊緣資料表和圖表。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

建立節點和邊緣資料表

圖表是根據現有的 BigQuery 資料表建構而成,並儲存在資料集中。如要儲存您在下列範例中建立的資料表和圖表,請建立資料集。以下查詢會建立名為 graph_db 的資料集:

CREATE SCHEMA IF NOT EXISTS graph_db;

下表包含人員和帳戶的相關資訊,以及這些實體之間的關係:

  • Person:有關人員的資訊。
  • Account:銀行帳戶資訊。
  • PersonOwnAccount:說明哪些帳戶屬於哪些使用者。
  • AccountTransferAccount:帳戶間轉移的相關資訊。

如要建立這些資料表,請執行下列CREATE TABLE陳述式

CREATE OR REPLACE TABLE graph_db.Person (
  id               INT64,
  name             STRING,
  birthday         TIMESTAMP,
  country          STRING,
  city             STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE OR REPLACE TABLE graph_db.Account (
  id               INT64,
  create_time      TIMESTAMP,
  is_blocked       BOOL,
  nick_name        STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE OR REPLACE TABLE graph_db.PersonOwnAccount (
  id               INT64 NOT NULL,
  account_id       INT64 NOT NULL,
  create_time      TIMESTAMP,
  PRIMARY KEY (id, account_id) NOT ENFORCED,
  FOREIGN KEY (id) REFERENCES graph_db.Person(id) NOT ENFORCED,
  FOREIGN KEY (account_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);

CREATE OR REPLACE TABLE graph_db.AccountTransferAccount (
  id               INT64 NOT NULL,
  to_id            INT64 NOT NULL,
  amount           FLOAT64,
  create_time      TIMESTAMP NOT NULL,
  order_number     STRING,
  PRIMARY KEY (id, to_id, create_time) NOT ENFORCED,
  FOREIGN KEY (id) REFERENCES graph_db.Account(id) NOT ENFORCED,
  FOREIGN KEY (to_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);

建立圖表

如要建立圖表,請使用 CREATE PROPERTY GRAPH 陳述式。以下範例會在 graph_db 資料集中建立名為 FinGraph 的圖表。AccountPerson 資料表是節點資料表。AccountTransferAccountPersonOwnAccount 資料表是邊緣資料表,代表節點資料表之間的關係。

CREATE OR REPLACE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Account,
    graph_db.Person
  )
  EDGE TABLES (
    graph_db.PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
      LABEL Owns,
    graph_db.AccountTransferAccount
      SOURCE KEY (id) REFERENCES Account (id)
      DESTINATION KEY (to_id) REFERENCES Account (id)
      LABEL Transfers
  );

插入資料

如要更新圖表中的資料,請更新節點和邊緣資料表中的資料。 建立圖表時,系統不會移動或複製資料。而是以圖表做為節點和邊緣資料表中的資料邏輯檢視畫面。圖形查詢會根據您執行查詢時節點和邊緣資料表中的資料,傳回結果。

下列查詢會將資料插入您建立的資料表:

INSERT INTO graph_db.Account
  (id, create_time, is_blocked, nick_name)
VALUES
  (7,"2020-01-10 06:22:20.222",false,"Vacation Fund"),
  (16,"2020-01-27 17:55:09.206",true,"Vacation Fund"),
  (20,"2020-02-18 05:44:20.655",false,"Rainy Day Fund");

INSERT INTO graph_db.Person
  (id, name, birthday, country, city)
VALUES
  (1,"Alex","1991-12-21 00:00:00","Australia","Adelaide"),
  (2,"Dana","1980-10-31 00:00:00","Czech_Republic","Moravia"),
  (3,"Lee","1986-12-07 00:00:00","India","Kollam");

INSERT INTO graph_db.AccountTransferAccount
  (id, to_id, amount, create_time, order_number)
VALUES
  (7,16,300,"2020-08-29 15:28:58.647","304330008004315"),
  (7,16,100,"2020-10-04 16:55:05.342","304120005529714"),
  (16,20,300,"2020-09-25 02:36:14.926","103650009791820"),
  (20,7,500,"2020-10-04 16:55:05.342","304120005529714"),
  (20,16,200,"2020-10-17 03:59:40.247","302290001255747");

INSERT INTO graph_db.PersonOwnAccount
  (id, account_id, create_time)
VALUES
  (1,7,"2020-01-10 06:22:20.222"),
  (2,20,"2020-01-27 17:55:09.206"),
  (3,16,"2020-02-18 05:44:20.655");

財務圖表範例的視覺化呈現

查詢圖表

如要查詢圖表,請執行使用 Graph Query Language 的查詢。

下列查詢使用 MATCH 陳述式,找出 Dana 將款項轉給誰的相關資訊:

GRAPH graph_db.FinGraph
MATCH
  (person:Person {name: "Dana"})-[own:Owns]->
  (account:Account)-[transfer:Transfers]->(account2:Account)<-[own2:Owns]-(person2:Person)
RETURN
  person.name AS owner,
  transfer.amount AS amount,
  person2.name AS transferred_to
ORDER BY person2.name;

結果類似下方:

+-------+--------+----------------+
| owner | amount | transferred_to |
+-------+--------+----------------+
| Dana  | 500.0  | Alex           |
| Dana  | 200.0  | Lee            |
+-------+--------+----------------+

以視覺化方式呈現圖形查詢結果

您可以在筆記本中使用 %%bigquery --graph magic 指令,然後輸入 GQL 查詢,將圖形查詢結果視覺化。查詢必須以 JSON 格式傳回圖表元素。如要將上一節執行的查詢結果視覺化,請在筆記本程式碼儲存格中執行下列查詢:

%%bigquery --graph
GRAPH graph_db.FinGraph
MATCH
  p = ((person:Person {name: "Dana"})-[own:Owns]->
  (account:Account)-[transfer:Transfers]->(acount2:Account)<-[own2:Owns]-(person2:Person))
RETURN
  TO_JSON(p) AS path;

筆記本中 Dana 的轉移作業視覺化

刪除圖表

如要刪除圖表,請使用 DROP PROPERTY GRAPH 陳述式。刪除圖不會影響用於定義圖節點和邊緣的資料表。下列查詢會刪除 FinGraph 圖表:

DROP PROPERTY GRAPH graph_db.FinGraph;

後續步驟