建立及查詢圖表
BigQuery Graph 可讓您將關聯資料建立為節點和邊緣,並使用Graph Query Language (GQL) 查詢複雜的關係。在本教學課程中,您將為財務資料集建立節點和邊緣資料表、定義屬性圖,以及執行圖表模式查詢。
必要的角色
如要取得使用圖表所需的權限,請要求管理員針對您建立節點資料表、邊緣資料表和圖表的資料集,授予您 BigQuery 資料編輯者 (roles/bigquery.dataEditor) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這個預先定義的角色具備使用圖表所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
必須具備下列權限,才能使用圖表:
-
建立圖表:
bigquery.propertyGraphs.create -
列出圖表及其中繼資料:
bigquery.propertyGraphs.list -
取得圖表的中繼資料和定義:
bigquery.propertyGraphs.get -
更新圖表的中繼資料和定義:
bigquery.propertyGraphs.update -
刪除圖表:
bigquery.propertyGraphs.delete
建立節點和邊緣資料表
圖表是根據現有的 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 陳述式或視覺化圖表模型工具。以下範例使用 CREATE PROPERTY GRAPH 陳述式,在 graph_db 資料集中建立名為 FinGraph 的圖表。Account 和 Person 資料表是節點資料表。AccountTransferAccount 和 PersonOwnAccount 資料表是邊緣資料表,代表節點資料表之間的關係。
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 | +-------+--------+----------------+
您也可以在對話式數據分析中,將圖譜做為資料來源,以自然語言詢問圖譜相關問題。例如,您可以詢問「Dana 將錢轉給了誰,轉了多少錢?」
以圖表呈現圖表查詢結果
您可以使用 %%bigquery --graph 魔術指令,後接 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;

刪除圖表
如要刪除圖表,請使用 DROP PROPERTY GRAPH 陳述式。刪除圖表不會影響用於定義圖表節點和邊緣的資料表。下列查詢會刪除 FinGraph 圖表:
DROP PROPERTY GRAPH graph_db.FinGraph;
後續步驟
- 請參閱 BigQuery Graph 簡介。
- 進一步瞭解圖表結構定義。
- 進一步瞭解如何編寫圖表查詢。
- 進一步瞭解 Graph Query Language (GQL)。
- 如需詐欺偵測教學課程,請參閱「使用 BigQuery Graph 偵測詐欺行為」。
- 如需顧客設定檔的教學課程,請參閱「使用 BigQuery Graph 建構 360 度全方位顧客推薦」。
- 如需供應鏈教學課程,請參閱「使用 BigQuery Graph 追蹤供應鏈」。