實驗室 3:運用 BigQuery 圖表和對話式數據分析功能找出遺失的貨物

1. 簡介

歡迎來到「遺失貨物」調查的最後階段!我們從倫敦一路追蹤裝有 Android 公仔的失竊貨櫃,最後來到雪梨,但線索就此中斷。貨櫃的智慧安全保險箱停用應答器後,已自動觸發緊急封鎖

為了在貨物永久鎖定前取回高價值貨物,你的任務是找出貨櫃的最終位置,並取得手動覆寫密碼,以實際解鎖保險庫。

Lost Cargo Lab 3 對話式數據分析架構預先發布版

為尋找遺失的貨櫃並確保貨物安全,您將建構 BigQuery 屬性圖,追蹤貨運的運送過程。接著,您會使用對話式 Analytics,以自然語言查詢這個網路,最後使用Knowledge Catalog對資料的中繼資料執行語意搜尋,找出覆寫代碼。

💡 錯過實驗室 1實驗室 2別擔心!本實驗室完全自給自足。環境設定步驟會佈建所有必要項目,方便您直接開始獨立完成實驗室。

學習內容

  • 複製存放區,並在 Google Cloud Shell 中執行設定指令碼。
  • 在 BigQuery 中建立屬性圖,連結公司、船隻和貨單資料。
  • 使用對話式數據分析,以自然語言查詢圖表,追蹤貨物運送過程,找出負責的作業人員。
  • 使用Knowledge Catalog 找出含有最終覆寫代碼的資料表。
  • 使用 BigQuery 資料欄層級存取權控管,取消遮蓋並顯示最終代碼。

軟硬體需求

  • 網路瀏覽器,例如 Chrome
  • 已啟用計費功能的 Google Cloud 雲端專案
  • 存取 Google Cloud Shell

本程式碼研究室適合各種程度的資料從業人員。

本程式碼研究室建立的資源費用應低於 $5 美元。

預計時間:完成本程式碼研究室約需 45 分鐘。

2. 事前準備

建立 Google Cloud 專案

  1. Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案
  2. 確認 Cloud 專案已啟用計費功能。

啟動 Cloud Shell

您將使用 Google Cloud Shell 下載程式碼、執行設定指令碼,以及部署應用程式。

  1. 在新瀏覽器分頁中開啟 Cloud Shell

啟用 Cloud Shell

  1. 連線後,請設定專案 ID 並確認環境:
gcloud config set project <<YOUR_PROJECT_ID>>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1

您應會看見類似以下的訊息:

Your active configuration is: [cloudshell-####]
Updated property [core/project]

啟用必要的 API

在 Cloud Shell 執行下列指令,啟用必要的 API:

gcloud services enable \
 bigquery.googleapis.com \
 aiplatform.googleapis.com \
 datacatalog.googleapis.com  \
 geminidataanalytics.googleapis.com \
 cloudaicompanion.googleapis.com 

執行成功後,您應該會看到類似以下的訊息:

Operation "operations/..." finished successfully.

3. 設定環境

在本系列課程的先前實驗室中,我們已為調查奠定基礎。

1. 複製存放區

將程式碼研究室存放區複製到 Cloud Shell 殼層環境:

cd ~/
git clone --filter=blob:none --no-checkout https://github.com/GoogleCloudPlatform/devrel-demos.git
cd ~/devrel-demos
git sparse-checkout init --cone
git sparse-checkout set codelabs/bigquery-graph-analytics
git checkout main
cd codelabs/bigquery-graph-analytics/

2. 設定基本資料表和政策標記

執行設定指令碼,填入 BigQuery 資料集並套用資料欄層級安全防護標記,限制存取機密資料:

bash setup_lab.sh

確認終端機的輸出內容顯示初始化成功:

🚀 Provisioning foundational tables and deploying Policy Tag security bindings...
🎯 Active Project: your-project-id
...
🎉 Success! Foundational tables initialized and Column-Level Policy Tags fully mapped out of the box!

環境設定完成後,物流資料就會填入 BigQuery,現在您可以建構屬性圖,連結資料表並追蹤貨物運送過程!

4. 使用 BigQuery 圖表連結資料

為分析供應鏈資料,我們將定義公司、船隻和艙單之間的關係。建立屬性圖後,我們就能輕鬆查詢這些連結。

1. 屬性圖如何模擬關係

屬性圖編譯架構地圖

BigQuery 屬性圖會使用下列項目建立網路模型:

  • 節點:網路中的實體。在本實驗室中,節點代表「公司」 (直接儲存聯絡資料)、「資訊清單」和「船隻」
  • 邊緣:連結節點的關係。例如:
    • 邊緣會將資訊清單連結至容器 (透過 manifests 表格中的關係)。
    • 邊緣會將「船隻」連結至「公司」 (透過 vessels 表格中的關係)。
  • 屬性:儲存在節點或邊緣的中繼資料。舉例來說,「公司」節點有「company_name」和「phone_number」等資料欄,「資訊清單」節點則有「seal_integrity_status」和座標 (last_ping_latlast_ping_long)。
  • 標籤:指派給節點 (例如 CompanyVesselManifest) 和邊緣 (例如 CARRIED_BYOPERATED_BY) 的標記名稱,方便查詢工具辨識節點和關係類型。

2. 在 BigQuery 中部署 Property Graph

setup_graph.sql 檔案包含用於定義及建立屬性圖形的 SQL DDL,但目前不完整。您必須先在這個結構定義檔案中定義邊緣標籤 (關係),再編譯及部署該檔案:

  1. 開啟 Cloud Shell 編輯器。

開啟 Cloud Shell 編輯器

  1. 在 Cloud Shell 編輯器中開啟 setup_graph.sql 檔案。

建立圖表的 SQL

  1. 找出邊緣標籤的預留位置:
    • 第 22 行:以有意義的標記取代 `EDGE_TABLE_PLACEHOLDER`,代表資訊清單與船隻的關係 (例如 CARRIED_BY)。
    • 第 27 行:將 `EDGE_TABLE_PLACEHOLDER` 替換為代表船隻與公司關係的標記 (例如 OPERATED_BY)。
  2. 儲存檔案。

現在返回 Cloud Shell 終端機,並使用完成的指令碼部署更新後的屬性圖:

bq query --use_legacy_sql=false < setup_graph.sql

輸出內容應該會指出工作已完成:

Waiting on bqjob_r... ... (0s) Current status: DONE

您可以在 BigQuery 控制台中查看 Property Graph 詳細資料:

找出「lost_cargo_dataset」lost_cargo_dataset,然後選取「圖表」:

屬性圖編譯架構地圖

屬性圖表編譯完成後,我們將深入瞭解 BigQuery Studio,查詢並視覺化呈現連結!

5. 查詢圖形

您可以使用原生 Graph Query Language (GQL),直接在 BigQuery Studio 中查詢及探索圖表。

1. 查詢貨櫃 -> 船隻 -> 公司鏈

讓我們透過找出貨物運輸船的營運者,探索 GQL 查詢。如要找出營運者,必須在物流網路中遍歷三個不同的實體節點:

圖形節點概念

  1. 從容器 Manifest 節點開始。
  2. 追蹤 CARRIED_BY 關係邊緣,找出攜帶 Vessel
  3. 從該容器追蹤 OPERATED_BY 關係邊緣至負責的 Company,並擷取其 ID。

首先,請執行查詢來視覺化整個網路 (不含任何篩選器),查看完整圖表。

  1. 在 BigQuery Studio SQL 編輯器中開啟新分頁,貼上下列 GQL 查詢,然後按一下「執行」
    SELECT * FROM GRAPH_TABLE(
      `lost_cargo_dataset.logistics_network`
      MATCH p = (m:Manifest)-[:CARRIED_BY]->(v:Vessel)-[:OPERATED_BY]->(comp:Company)
      RETURN TO_JSON(p) AS path
    );
    
  2. 查詢完成後,在底部的「查詢結果」窗格中,按一下「圖表」分頁 (位於「結果表格」分頁旁)。

BigQuery Graph 結果 1

  1. BigQuery 會將結果呈現為互動式視覺化圖表!放大畫面,即可查看連結的貨櫃、船隻和營運商的完整網路。

GQL 查詢剖析

讓我們細看剛才執行的 GQL 查詢:

  • GRAPH_TABLE:指示 BigQuery 對 logistics_network 圖表執行屬性圖表查詢。
  • MATCH:宣告多重躍點遍歷模式。我們從 Manifest (m) 開始,比對指向 Vessel (v) 的邊緣關係 :CARRIED_BY,然後比對指向 Company (comp) 的邊緣關係 :OPERATED_BY
  • GQL 會以直覺式、使用者可判讀的 ASCII 藝術關係箭頭 ()->[]->() 取代複雜的聯結邏輯,讓您輕鬆編寫及最佳化多重躍點查詢。
  • RETURN:從相符元素傳回屬性或 JSON 路徑。

2. 篩選 GQL 查詢結果

現在,讓我們篩選查詢,只查看目標遭入侵容器 MV-CAPYBARA-003 的路徑。

  1. 將下列查詢貼到 SQL 編輯器,然後按一下「執行」
    SELECT * FROM GRAPH_TABLE(
      `lost_cargo_dataset.logistics_network`
      MATCH p = (m:Manifest {shipment_id: 'MV-CAPYBARA-003'})-[:CARRIED_BY]->(v:Vessel)-[:OPERATED_BY]->(comp:Company)
      RETURN TO_JSON(p) AS path
    );
    
  2. 按一下結果下方的「圖表」分頁標籤。

BigQuery Graph 結果 2

  1. 檢視器現在只會顯示 MV-CAPYBARA-003 的有效遍歷路徑。放大即可查看節點和連線:
    • Company 節點上按兩下,開啟「屬性」面板。在「屬性」下方,您會看到運算子 company_id103 (Davy Jones Shipping)。記下這個公司 ID,稍後您需要這個 ID,才能從安全登錄檔擷取通關密碼!
    • 按兩下 Vessel 節點,確認是否為 Flying Dutchman

6. 使用對話式數據分析與圖表對話

您已手動查詢圖表來找出公司 ID,現在讓我們使用對話式數據分析,直接與圖表對話,找出容器的去向。

1. 啟動對話內容分析工作階段

  1. 前往 Google Cloud 控制台的 BigQuery 控制台,然後展開資源面板,找出您的資料集 (lost_cargo_dataset)。
  2. 按一下「Property Graph」資源:logistics_network
  3. 在頂端的詳細資料面板工具列中,按一下「對話」按鈕。系統會開啟預先載入圖表內容的對話式數據分析工作階段。

BigQuery Data Agent 設定介面,可連結已編譯的 Property Graph 來源

2. 找出遭劫持貨櫃最近的停靠港

海巡飛機剛才在座標 POINT(-122.48 37.55) 發現一艘船隻,與我們貨船的描述相符,且在離線狀態下航行 (應答器已停用)。為攔截貨物,我們需要找到最近的停靠港,該處有影子集團 Davy Jones Shipping 的活動。

我們不會手動搜尋所有全球港口,而是查詢圖表網路,找出與聯盟現役船隊相連的港口,並測量哪個港口與目擊地點的實際距離最近!

  1. 在「對話式數據分析」對話方塊中,輸入下列提示:
    Find all ports associated with Davy Jones Shipping vessels. Which port is closest to coordinate POINT(-122.48 37.55), show the distance in km, and display it on a map.
    

BigQuery Data Agent 設定介面,可連結已編譯的 Property Graph 來源

  1. 仔細查看回覆。代理程式會遍歷圖表,並傳回最近的停靠設施及其距離:
    • 擴充底座連接埠Mountain View Terminal
    • 距離39.42 kilometers
  2. 由於對話式數據分析採用 Gemini 技術,並整合了原生地理空間 (GIS) 功能,因此可以解讀地理座標點,並運用全球知識驗證位置:「這艘船隻距離加州山景城終點站約 39.42 公里,表示船隻正前往該處停靠。」

這表示貨物正直接運往山景城!

幕後運作:Graph Query Language (GQL) 和地理空間 GIS

在幕後,對話式數據分析代理程式會動態編譯及執行查詢,將圖形路徑比對與地理空間距離計算結合。這是透過原生 GQL COLUMNS 子句達成,在圖形遍歷比對中原生計算測地距離:

SELECT port_id, port_name, country, latitude, longitude, distance_km 
FROM GRAPH_TABLE(
  `lost_cargo_dataset.logistics_network`
  MATCH (c:Company)<-[]-(v:Vessel)-[]->(p:Port)
  WHERE LOWER(c.company_name) = 'davy jones shipping'
  COLUMNS (
    p.port_id, 
    p.port_name, 
    p.country, 
    p.latitude, 
    p.longitude, 
    ROUND(ST_DISTANCE(ST_GEOGPOINT(p.longitude, p.latitude), ST_GEOGPOINT(-122.48, 37.55)) / 1000, 2) AS distance_km
  )
)
ORDER BY distance_km ASC;

結合原生地理空間 (GIS) 函式 (ST_DISTANCEST_GEOGPOINT) 和 GQL 屬性圖形比對,BigQuery 就能在單一查詢中動態解析聯盟的營運足跡,並計算實際的實體鄰近程度!

7. 使用 Knowledge Catalog 找出缺少的資料

屬性圖表會顯示關係,但不會包含儲存實際覆寫代碼的資料表。

在擁有數百個資料集和資料表的實際企業環境中,要找到這項資訊可能很困難。我們將使用 Knowledge Catalog 執行語意搜尋,找出正確的資料表。

1. Knowledge Catalog 的語意搜尋功能

  1. Google Cloud 控制台中,搜尋並前往「Knowledge Catalog」➔「搜尋」
  2. 在「系統」下方的篩選欄中,勾選「BigQuery」,縮小搜尋範圍。
  3. 在搜尋框中輸入下列查詢:
    container override codes
    

Knowledge Catalog 語意搜尋介面正在查詢獨立的實體密封表

  1. 按一下搜尋結果中顯示的 maritime_security_registry 資料表資源:

檢查中繼資料結構定義後,您會發現資料表包含容器安全資料的資料欄,例如協調員公司 co_id、保管人權杖 cust_tok,以及最重要的安全容器覆寫密碼資料欄:clc_ovr_cd

我們已成功找到資料表和確切的安全資料欄,可以取回貨物!

🔓 實務治理:在正式企業環境中,安全與治理團隊也會運用下列項目:

  • 切面和標記範本:將業務中繼資料 (例如資料擁有者保留期限個人識別資訊分類) 附加至表格結構定義。
  • 資料歷程:自動產生視覺化流程圖,呈現下游系統查詢及使用 maritime_security_registry 等資料表的方式。

2. 檢查 BigQuery 中的資料欄安全防護機制

  1. 返回 BigQuery 控制台
  2. 在「Explorer」分頁標籤中,選取 lost_cargo_dataset,然後點按「maritime_security_registry資料表。
  3. 按一下「結構定義」分頁標籤。

資料表結構定義檢視畫面,顯示指派給 clc_ovr_cd 資料欄的政策標記

  1. 請注意,clc_ovr_cd 資料欄受到名為 MaskShippingDetails 的政策標記保護 (列於「政策標記」欄中)。
  2. 在 BigQuery 中開啟新的 SQL 編輯器分頁,然後執行下列查詢,嘗試查看登錄檔覆寫程式碼:
    SELECT * FROM `lost_cargo_dataset.maritime_security_registry` 
    WHERE co_id = 103;
    
  3. 由於您的帳戶尚未取得讀取標記 MaskShippingDetails 資料欄的權限,查詢會立即失敗,並顯示「存取遭拒」資料庫安全性錯誤:

BigQuery 工作區檢視畫面輸出標準資料欄層級遮蓋或拒絕存取限制

8. 破解資料欄安全防護機制以擷取密碼

如要以明文讀取最終覆寫代碼,我們需要授予使用者帳戶權限,讀取標記 MaskShippingDetails 的資料欄。

1. 授予政策標記權限

  1. 在 BigQuery 控制台左側的導覽窗格中,前往「政策標記」
  2. 選取名為「LostCargoSecurity_」的分類。
  3. 在代碼清單中,按一下「MaskShippingDetails
  4. 在畫面右側的「資訊面板」中,按一下「新增主體」。(如果面板已隱藏,請按一下右上角的「顯示資訊面板」)。
  5. 在「New principals」(新增主體) 欄位中,輸入有效的 Google Cloud 使用者電子郵件地址。
  6. 在「Select a role」(請選擇角色) 下拉式選單中,搜尋並選取「Fine-Grained Reader」(細部讀取者),然後按一下「Save」(儲存)

BigQuery 政策標記管理面板,在目標字串遮蓋上指派精細讀取者角色

2. 查詢覆寫代碼

返回 BigQuery 工作區編輯器。由於您現在擁有精細的讀取者存取權,我們應該可以再次執行查詢,並查看未遮蓋的資料:

SELECT *  FROM `lost_cargo_dataset.maritime_security_registry` 
WHERE co_id = 103;

🔓 結果

查詢會傳回未遮蓋的覆寫代碼:

SHIVER-ME-TIMBERS-888

BigQuery 工作區執行結果會傳回未遮蓋的明確字串旗標

9. 清理

為避免產生費用,請清理在本實驗室中建立的沙箱資源。

返回 Cloud Shell 終端機,刪除包含物流資料表的 BigQuery 資料集

bq rm -r -f -d lost_cargo_dataset

移除複製的存放區檔案:

cd ..
rm -rf data-cloud-roadshow-26

10. 恭喜

您已成功解決調查問題,並取得通關覆寫代碼!

目前所學內容

  • 瞭解如何在 BigQuery 中建構屬性圖,表示複雜的實體和關係。
  • 如何設定「節點」、「邊緣」、「屬性」和「標籤」來擷取資料連結。
  • 如何使用 BigQuery 對話式數據分析,以自然語言查詢屬性圖。
  • 如何建構 Graph Query Language (GQL) 運算式,以遍歷關聯路徑。
  • 如何使用 Knowledge Catalog 探索受保護的資產,以及如何使用政策標記存取資料欄層級的受限資料。