1. 簡介
歡迎來到「遺失貨物」調查的最後階段!我們從倫敦一路追蹤裝有 Android 公仔的失竊貨櫃,最後來到雪梨,但線索就此中斷。貨櫃的智慧安全保險箱停用應答器後,已自動觸發緊急封鎖。
為了在貨物永久鎖定前取回高價值貨物,你的任務是找出貨櫃的最終位置,並取得手動覆寫密碼,以實際解鎖保險庫。

為尋找遺失的貨櫃並確保貨物安全,您將建構 BigQuery 屬性圖,追蹤貨運的運送過程。接著,您會使用對話式 Analytics,以自然語言查詢這個網路,最後使用Knowledge Catalog對資料的中繼資料執行語意搜尋,找出覆寫代碼。
💡 錯過實驗室 1或實驗室 2?別擔心!本實驗室完全自給自足。環境設定步驟會佈建所有必要項目,方便您直接開始獨立完成實驗室。
學習內容
- 複製存放區,並在 Google Cloud Shell 中執行設定指令碼。
- 在 BigQuery 中建立屬性圖,連結公司、船隻和貨單資料。
- 使用對話式數據分析,以自然語言查詢圖表,追蹤貨物運送過程,找出負責的作業人員。
- 使用Knowledge Catalog 找出含有最終覆寫代碼的資料表。
- 使用 BigQuery 資料欄層級存取權控管,取消遮蓋並顯示最終代碼。
軟硬體需求
- 網路瀏覽器,例如 Chrome
- 已啟用計費功能的 Google Cloud 雲端專案
- 存取 Google Cloud Shell
本程式碼研究室適合各種程度的資料從業人員。
本程式碼研究室建立的資源費用應低於 $5 美元。
預計時間:完成本程式碼研究室約需 45 分鐘。
2. 事前準備
建立 Google Cloud 專案
- 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。
- 確認 Cloud 專案已啟用計費功能。
啟動 Cloud Shell
您將使用 Google Cloud Shell 下載程式碼、執行設定指令碼,以及部署應用程式。
- 在新瀏覽器分頁中開啟 Cloud Shell:

- 連線後,請設定專案 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_lat、last_ping_long)。 - 標籤:指派給節點 (例如
Company、Vessel、Manifest) 和邊緣 (例如CARRIED_BY、OPERATED_BY) 的標記名稱,方便查詢工具辨識節點和關係類型。
2. 在 BigQuery 中部署 Property Graph
setup_graph.sql 檔案包含用於定義及建立屬性圖形的 SQL DDL,但目前不完整。您必須先在這個結構定義檔案中定義邊緣標籤 (關係),再編譯及部署該檔案:
- 開啟 Cloud Shell 編輯器。

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

- 找出邊緣標籤的預留位置:
- 第 22 行:以有意義的標記取代
`EDGE_TABLE_PLACEHOLDER`,代表資訊清單與船隻的關係 (例如CARRIED_BY)。 - 第 27 行:將
`EDGE_TABLE_PLACEHOLDER`替換為代表船隻與公司關係的標記 (例如OPERATED_BY)。
- 第 22 行:以有意義的標記取代
- 儲存檔案。
現在返回 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 查詢。如要找出營運者,必須在物流網路中遍歷三個不同的實體節點:

- 從容器
Manifest節點開始。 - 追蹤
CARRIED_BY關係邊緣,找出攜帶Vessel。 - 從該容器追蹤
OPERATED_BY關係邊緣至負責的Company,並擷取其 ID。
首先,請執行查詢來視覺化整個網路 (不含任何篩選器),查看完整圖表。
- 在 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 ); - 查詢完成後,在底部的「查詢結果」窗格中,按一下「圖表」分頁 (位於「結果表格」分頁旁)。

- 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 的路徑。
- 將下列查詢貼到 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 ); - 按一下結果下方的「圖表」分頁標籤。

- 檢視器現在只會顯示
MV-CAPYBARA-003的有效遍歷路徑。放大即可查看節點和連線:- 在
Company節點上按兩下,開啟「屬性」面板。在「屬性」下方,您會看到運算子company_id:103(Davy Jones Shipping)。記下這個公司 ID,稍後您需要這個 ID,才能從安全登錄檔擷取通關密碼! - 按兩下
Vessel節點,確認是否為Flying Dutchman。
- 在
6. 使用對話式數據分析與圖表對話
您已手動查詢圖表來找出公司 ID,現在讓我們使用對話式數據分析,直接與圖表對話,找出容器的去向。
1. 啟動對話內容分析工作階段
- 前往 Google Cloud 控制台的 BigQuery 控制台,然後展開資源面板,找出您的資料集 (
lost_cargo_dataset)。 - 按一下「Property Graph」資源:
logistics_network。 - 在頂端的詳細資料面板工具列中,按一下「對話」按鈕。系統會開啟預先載入圖表內容的對話式數據分析工作階段。

2. 找出遭劫持貨櫃最近的停靠港
海巡飛機剛才在座標 POINT(-122.48 37.55) 發現一艘船隻,與我們貨船的描述相符,且在離線狀態下航行 (應答器已停用)。為攔截貨物,我們需要找到最近的停靠港,該處有影子集團 Davy Jones Shipping 的活動。
我們不會手動搜尋所有全球港口,而是查詢圖表網路,找出與聯盟現役船隊相連的港口,並測量哪個港口與目擊地點的實際距離最近!
- 在「對話式數據分析」對話方塊中,輸入下列提示:
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.

- 仔細查看回覆。代理程式會遍歷圖表,並傳回最近的停靠設施及其距離:
- 擴充底座連接埠:
Mountain View Terminal - 距離:
39.42 kilometers
- 擴充底座連接埠:
- 由於對話式數據分析採用 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_DISTANCE、ST_GEOGPOINT) 和 GQL 屬性圖形比對,BigQuery 就能在單一查詢中動態解析聯盟的營運足跡,並計算實際的實體鄰近程度!
7. 使用 Knowledge Catalog 找出缺少的資料
屬性圖表會顯示關係,但不會包含儲存實際覆寫代碼的資料表。
在擁有數百個資料集和資料表的實際企業環境中,要找到這項資訊可能很困難。我們將使用 Knowledge Catalog 執行語意搜尋,找出正確的資料表。
1. Knowledge Catalog 的語意搜尋功能
- 在 Google Cloud 控制台中,搜尋並前往「Knowledge Catalog」➔「搜尋」。
- 在「系統」下方的篩選欄中,勾選「BigQuery」,縮小搜尋範圍。
- 在搜尋框中輸入下列查詢:
container override codes

- 按一下搜尋結果中顯示的
maritime_security_registry資料表資源:
檢查中繼資料結構定義後,您會發現資料表包含容器安全資料的資料欄,例如協調員公司 co_id、保管人權杖 cust_tok,以及最重要的安全容器覆寫密碼資料欄:clc_ovr_cd。
我們已成功找到資料表和確切的安全資料欄,可以取回貨物!
🔓 實務治理:在正式企業環境中,安全與治理團隊也會運用下列項目:
- 切面和標記範本:將業務中繼資料 (例如資料擁有者、保留期限或個人識別資訊分類) 附加至表格結構定義。
- 資料歷程:自動產生視覺化流程圖,呈現下游系統查詢及使用
maritime_security_registry等資料表的方式。
2. 檢查 BigQuery 中的資料欄安全防護機制
- 返回 BigQuery 控制台。
- 在「Explorer」分頁標籤中,選取
lost_cargo_dataset,然後點按「maritime_security_registry」資料表。 - 按一下「結構定義」分頁標籤。

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

8. 破解資料欄安全防護機制以擷取密碼
如要以明文讀取最終覆寫代碼,我們需要授予使用者帳戶權限,讀取標記 MaskShippingDetails 的資料欄。
1. 授予政策標記權限
- 在 BigQuery 控制台左側的導覽窗格中,前往「政策標記」。
- 選取名為「
LostCargoSecurity_」的分類。 - 在代碼清單中,按一下「
MaskShippingDetails」。 - 在畫面右側的「資訊面板」中,按一下「新增主體」。(如果面板已隱藏,請按一下右上角的「顯示資訊面板」)。
- 在「New principals」(新增主體) 欄位中,輸入有效的 Google Cloud 使用者電子郵件地址。
- 在「Select a role」(請選擇角色) 下拉式選單中,搜尋並選取「Fine-Grained Reader」(細部讀取者),然後按一下「Save」(儲存)。

2. 查詢覆寫代碼
返回 BigQuery 工作區編輯器。由於您現在擁有精細的讀取者存取權,我們應該可以再次執行查詢,並查看未遮蓋的資料:
SELECT * FROM `lost_cargo_dataset.maritime_security_registry`
WHERE co_id = 103;
🔓 結果
查詢會傳回未遮蓋的覆寫代碼:
SHIVER-ME-TIMBERS-888

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 探索受保護的資產,以及如何使用政策標記存取資料欄層級的受限資料。