共用方式為


GQL 語言指南

備註

這項功能目前處於公開預覽狀態。 此預覽版是在沒有服務等級協定的情況下提供,不建議用於生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

GQL 圖形查詢語言是圖形資料庫的 ISO 標準化查詢語言。 它可協助您有效率地查詢和處理圖形資料。

GQL 由標準化 SQL 的 ISO 工作小組共同開發,確保一致性與嚴謹性。 如果你熟悉 SQL,你會發現 GQL 有很多相似之處(表達式、謂詞、型別),這會讓你更容易入門。 本指南既適合學習 GQL 基礎知識的新手,也適合尋求先進技術和全面參考資訊的經驗豐富的使用者。

備註

GQL 的官方國際標準是 ISO/IEC 39075 資訊科技 - 資料庫語言 - GQL

先決條件

在深入研究 GQL 之前,您應該熟悉以下概念:

  • 資料庫的基本了解——任何資料庫系統(例如關聯式(SQL)、NoSQL 或圖形)的經驗都很有幫助
  • 圖形概念 - 瞭解連線資料中的節點、邊緣和關係
  • 查詢基本概念 - 基本查詢概念的知識,例如篩選、排序和彙總

推薦背景:

  • 有 SQL 或 openCypher 語言的經驗,能讓學習 GQL 語法變得更容易(它們是 GQL 的根源)。
  • 熟悉資料建模有助於圖形結構描述設計
  • 了解圖形資料的特定使用案例

你需要什麼:

  • 存取具有圖形功能的 Microsoft Fabric
  • 範例資料或願意使用我們的社交網路範例
  • 用於編寫查詢的基本文本編輯器

小提示

如果您是圖形資料庫的新手,請先從 圖形資料模型概觀 開始,再繼續本指南。

GQL 有何特別之處

GQL 專為圖形資料而設計。 這使得處理連接資訊變得自然直觀。

與依賴表格連接來表達關係的 SQL 不同,GQL 使用視覺圖模式,直接鏡像實體之間的連結方式,使查詢更易閱讀與推理。

假設你想找1999年以前出生的人和他們的朋友(彼此認識的人)。 以下是 GQL 如何用視覺圖圖來表達這一點:

MATCH (person:Person)-[:knows]-(friend:Person)
WHERE person.birthday < 19990101 
  AND friend.birthday < 19990101
RETURN person.firstName || ' ' || person.lastName AS person_name, 
       friend.firstName || ' ' || friend.lastName AS friend_name

此查詢會尋找 1999 年之前出生的朋友 (彼此認識的人)。 該模式 (person:Person)-[:knows]-(friend:Person) 直觀地顯示了您要尋找的關係結構,就像繪製資料圖表一樣。

GQL 基本概念

在深入研究查詢之前,請先了解構成 GQL 基礎的以下核心概念:

  • 圖會 將你的資料儲存為節點(實體)和邊(關係),每個節點都有標籤和屬性
  • 圖形類型 就像結構描述一樣,定義圖形中可以存在哪些節點和邊緣
  • 限制 是圖類型對圖施加的額外規則與限制,以強制資料完整性
  • 查詢會使用 、 MATCHFILTERRETURN陳述式來處理資料並顯示結果
  • 模式 描述了您想要使用直觀的視覺語法查找的圖形結構
  • 運算式會 對資料執行計算和比較,類似於 SQL 運算式
  • 謂詞 是用於查詢中篩選結果的布林值表達式
  • 值類型定義 您可以處理和儲存的值類型

瞭解圖形資料

若要有效地使用 GQL,您需要瞭解圖形資料的結構。 此基礎可協助您撰寫更好的查詢並有效地建立資料模型。

節點和邊緣:建構區塊

在 GQL 中,您可以使用標記的屬性圖表。 圖形由兩種類型的元素組成:

節點 通常代表系統中的實體 (「名詞」),例如人員、組織、貼文或產品。 它們是存在於您網域中的獨立物件。 節點有時也稱為頂點。

代表實體之間的關係 (“動詞”),即實體如何連接和互動。 例如,人們彼此認識(:knows)、在特定地區營運的組織(:operates)、或購買產品的顧客(:purchased)。
邊緣有時也稱為關係。

每個圖形元素都有以下特徵:

  • 唯一識別它的內部 ID
  • 一或多個標籤 - 描述性名稱,例如 Personknows。 在 Microsoft Fabric 中,圖形邊總是只有一個標籤。
  • 屬性——儲存關於元素資料的名稱與值對(例如 firstName: "Alice"birthday: "19730108")。

圖表的結構

每個 Edge 恰好連接兩個節點:來源和目的地。 此連接創建了圖形的結構並顯示了實體如何相互關聯。 邊的方向很重要——Personfollows另一個人Person創造了一種定向關係。

備註

Microsoft Fabric 中的圖形目前不支援無向邊。

Microsoft Fabric 所支援的屬性圖總是良好形成的,意即每條邊連接兩個有效節點。 如果您在圖形中看到邊緣,則其兩個端點都存在於相同的圖形中。

圖形模型和圖形類型

Microsoft Fabric 中圖形的結構是由其 圖形模型描述,其作用類似於應用程式網域的資料庫結構描述。 圖形模型定義:

  • 哪些節點和邊緣可以存在
  • 它們可以具有哪些標籤和屬性
  • 節點和邊緣如何連線

圖形模型也透過約束來確保資料完整性,特別是 節點鍵約束 ,指定哪些屬性唯一地識別每個節點。

備註

可以使用 GQL 標準語法指定圖形模型,在這種情況下,它們稱為 圖形類型

一個實際的例子:社交網絡

在本文件中,我們使用社交網路範例來說明 GQL 概念。 瞭解此網域有助於您遵循範例,並將類似的模式套用至您自己的資料。

顯示社交網路結構描述的圖表。

備註

社交網絡的例子源自 GDC(圖數據委員會)發布的 LDBC SNB(LDBC 社交網絡基準)。 有關更多詳細信息 ,請參閱文章“LDBC 社交網絡基準”

社交網路實體

我們的社交網絡包括以下主要類型的節點,代表域的實體:

人們 擁有姓名、生日和性別等個人資訊。 他們生活在城市並形成社會聯繫。

地點形成 地理層次結構:

  • 「紐約」或「倫敦」等城市
  • 國家/地區,例如「美國」或「英國」
  • 「北美」或「歐洲」等大陸

人們花時間的組織

  • 人們學習的大學
  • 有人工作的公司

內容與討論:

  • 標題包含貼文的論壇
  • 包含內容、語言和可選圖片的貼文
  • 回覆貼文或其他留言的留言
  • 對內容進行分類並代表興趣的標籤

一切如何連接

實體之間的連接使網路變得有趣:

  • 人們彼此認識(友誼, :knows
  • 人們在公司工作(:workAt)或在大學就讀(:studyAt
  • 人們會:hasCreator發文和留言()
  • 人們按:likes讚貼文和留言()
  • 貼文、論壇、留言都可以有標籤():hasTag
  • 人們對特定標籤有興趣(:hasInterest
  • 論壇包含貼文():containerOf並設有成員(:hasMember)和版主(:hasModerator

圖形邊緣代表領域關係。 這個豐富的網絡為有趣的查詢和分析創造了許多機會。

您的第一個 GQL 查詢

現在您已經了解了圖形基礎知識,讓我們看看如何使用 GQL 查詢圖形資料。 這些範例從簡單到複雜構建,向您展示 GQL 的方法如何使圖形查詢變得直觀且強大。

從簡單開始:找到所有人

讓我們從最基本的查詢開始,找出圖中所有人物:Person的名字(名字、姓氏)。

MATCH (p:Person)
RETURN p.firstName, p.lastName

此查詢的執行方式如下:

  1. MATCH 尋找所有標記為 Person
  2. RETURN 顯示他們的名字和姓氏

新增篩選:尋找特定人員

現在我們找出具有特定特徵的人,這裡是所有叫 Alice 的人,並展示他們的名字和生日。

MATCH (p:Person)
FILTER p.firstName = 'Annemarie'
RETURN p.firstName, p.lastName, p.birthday

此查詢的執行方式如下:

  1. MATCH 找到所有標記為 Person 的節點 (p)
  2. FILTER 節點 (p) 名字為 Alice
  3. RETURN 顯示他們的名字、姓氏和生日

基本查詢結構

基本 GQL 查詢都遵循一致的模式:一系列語句,這些陳述式協同工作以尋找、篩選和傳回資料。 大多數查詢從尋找圖中的模式開始 MATCH ,最後以 RETURN 指定輸出結束。

這裡有一個簡單的查詢,可以找到彼此認識且同一生日的人配對,然後回傳這些朋友配對的總數。

MATCH (n:Person)-[:knows]-(m:Person)
FILTER n.birthday = m.birthday
RETURN count(*) AS same_age_friends

此查詢的執行方式如下:

  1. MATCH尋找彼此認識的所有節點對Person
  2. FILTER 只保留兩個人生日相同的配對
  3. RETURN 數一數這樣的朋友對有多少

小提示

過濾也可以透過附加 WHERE 子句直接作為模式的一部分來執行。 例如, MATCH (n:Person WHERE n.age > 23) 只會比對 Person 屬性大於 23 的 age 節點。

備註

GQL支援C樣 // 式行註解、SQL樣式 -- 行註解和C樣 /* */ 式區塊註解。

常見陳述

  • MATCH: 識別要搜尋的圖型態——這裡是你定義你感興趣資料結構的地方。
  • LET:根據匹配資料指派新變數或計算值——將導出欄位加入結果。
  • FILTER:透過套用條件縮小結果範圍——移除不符合條件的列。
  • ORDER BY:篩選後的資料排序——根據一個或多個欄位協助組織輸出。
  • OFFSET 以及 LIMIT:限制回傳的列數——對分頁或頂尖查詢非常有用。
  • RETURN: 指定最終輸出——定義應包含哪些資料於結果集中,並執行彙總。

陳述式如何協同運作

GQL 語句形成一條管線,每個語句處理前一個語句的輸出。 這種序列執行使查詢易於閱讀與除錯,因為執行順序與讀取順序相符。

重點︰

  • 語句實際上是依序執行的。
  • 每個語句都會轉換資料並將它傳遞給下一個。
  • 這創造了清晰且可預測的資料流程,簡化了複雜的查詢。

這很重要

在內部,Microsoft Fabric 可以重新排序敘述的執行,並可平行執行個別敘述,以最大化效能。 不過,這不會影響結果的正確性。

範例

以下 GQL 查詢會找到前 10 位在公司名稱中帶有「Air」字樣的公司員工,依全名排序,並回傳他們的全名及公司名稱。

-- Data flows: Match → Let → Filter → Order → Limit → Return
MATCH (p:Person)-[:workAt]->(c:Company)           -- Input: unit table, Output: (p, c) table
LET fullName = p.firstName || ' ' || p.lastName   -- Input: (p, c) table, Output: (p, c, fullName) table
FILTER c.name CONTAINS 'Air'                      -- Input: (p, c, fullName) table, Output: filtered table
ORDER BY fullName                                 -- Input: filtered table, Output: sorted table
LIMIT 10                                          -- Input: sorted table, Output: top 10 rows table
RETURN fullName, c.name AS companyName            -- Input: top 10 rows table
                                                  -- Output: projected (fullName, companyName) result table

此查詢的執行方式如下:

  1. MATCH 尋找在公司名稱中帶有「Air」字樣的公司工作者
  2. LET 透過結合名字與姓氏來創造全名
  3. FILTER 只保留Contoso員工
  4. ORDER BY 按全名排序
  5. LIMIT 取前10個結果
  6. RETURN 報稅名稱與公司地點

變數連接您的資料

變數 (例如 p前面範例中的 、 cfullName ) 會在陳述式之間攜帶資料。 當您重複使用變數名稱時,GQL 會自動確保它引用相同的數據,從而建立強大的聯結條件。 變數有時也稱為繫結變數。

變數可以以不同的方式分類:

依綁定來源:

  • 模式變數 - 由相符的圖形模式所束縛
  • 常規變數 - 受其他語言結構約束

模式變數類型:

  • 元素變數 - 繫結至圖形元素參考值
    • 節點變數 - 繫結至個別節點
    • 邊緣變數 - 繫結至個別邊緣
  • 路徑變數 - 繫結至代表相符路徑的路徑值

按參考程度:

  • 單一變數 - 從型樣繫結至個別元素參考值
  • 群組變數 - 繫結至可變長度型樣中的元素參考值清單 (請參閱 進階彙總技術

執行結果和結果

當您執行查詢時,您會傳回包含下列內容的 執行結果

  • 包含陳述式中資料的 RETURN
  • 顯示查詢是否成功的狀態資訊

結果表格

結果表格 (如果存在) 是查詢執行的實際結果。

結果表格包括其直欄的名稱和類型、用來顯示結果的慣用直欄名稱序列、表格是否排序, 以及實際列本身的相關資訊。

備註

如果執行失敗,則執行結果中不會包含任何結果表格。

狀態資訊

在查詢執行期間會偵測到各種值得注意的條件 (例如錯誤或警告)。 每個此類條件都由執行結果的狀態資訊中的狀態物件記錄。

狀態資訊由主要狀態物件和其他狀態物件的 (可能是空的) 清單組成。 主要狀態物件一律存在,並指出查詢執行是成功還是失敗。

每個狀態物件都包含一個 5 位數的狀態碼(稱為 GQLSTATUS),用於識別記錄的條件以及描述它的訊息。

成功狀態碼:

GQL狀態 Message When
00000 註:成功完成 至少一列成功
00001 註:成功完成 - 省略結果 成功,沒有表格(目前未使用)
02000 注意:暫無資料 零列成功

其他狀態碼表示在查詢執行期間偵測到的進一步錯誤或警告。

這很重要

在應用程式程式碼中,一律依賴狀態碼來測試特定條件。 狀態碼保證穩定,其一般含義將來不會改變。 不要測試訊息內容,因為狀態碼所報告的具體訊息未來可能會因查詢不同,甚至在同一查詢執行間而改變。

此外,狀態物件可以包含基礎原因狀態物件和診斷記錄,其中包含描述記錄狀況的進一步資訊。

基本概念和陳述

本節涵蓋撰寫有效 GQL 查詢所需的核心建置區塊。 每個概念都建立為實用的查詢寫作技能。

圖形模式:尋找結構

圖形模式是 GQL 查詢的核心。 它們可讓您使用直覺的視覺化語法來描述您要尋找的資料結構,該語法看起來像您想要尋找的關係。

簡單圖案:

從基本關係模式開始:

-- Find direct friendships
(p:Person)-[:knows]->(f:Person)

-- Find people working at any company
(p:Person)-[:workAt]->(c:Company)

-- Find cities in any country/region
(ci:City)-[:isPartOf]->(co:Country)  

具有特定資料的模式:

-- Find who works at Microsoft specifically
(p:Person)-[:workAt]->(c:Company)
WHERE p.firstName = 'Annemarie'

-- Find friends who are both young
(p:Person)-[:knows]->(f:Person)  
WHERE p.birthday > 19950101 AND f.birthday > 19950101

用於靈活選擇實體的標籤表達式:

(:Person|Company)-[:isLocatedIn]->(p:City|Country)  -- OR with |
(:Place&City)                                       -- AND with &  
(:Person&!Company)                                  -- NOT with !

備註

多元素標籤的圖模型尚未支援(已知問題)。

標籤運算式可讓您在單一模式中比對不同類型的節點,讓您的查詢更加靈活。

變數重複使用會建立強大的聯結:

-- Find coworkers: people who work at the same company
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c)

變數 c 的重複使用可確保兩個人在同一 公司工作,從而建立自動加入約束。 此模式是表達「相同實體」關係的關鍵模式。

這很重要

關鍵見解:模式中的變數重複使用會產生結構限制。 這種技術是您表達複雜圖關係的方式,例如「在同一家公司工作的朋友」或「同一城市的人」。

使用 WHERE 進行模式層級篩選:

-- Filter during pattern matching (more efficient)
(p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.id > 1000)

-- Filter edges during matching  
(p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)

有界可變長度模式:

(:Person)-[:knows]->{1,3}(:Person)  -- Friends up to 3 degrees away

用於無週期遍歷的 TRAIL 模式:

使用 TRAIL 模式來防止圖遍歷期間的循環,確保每個邊緣最多被訪問一次:

-- Find paths without visiting the same :knows edge twice
MATCH TRAIL (src:Person)-[:knows]->{1,4}(dst:Person)
WHERE src.firstName = 'Alice' AND dst.firstName = 'Bob'
RETURN count(*) AS num_connections
-- Find acyclic paths in social networks
MATCH TRAIL (p:Person)-[e:knows]->{,3}(celebrity:Person)
RETURN 
  p.firstName || ' ' || p.lastName AS person_name, 
  celebrity.firstName || ' ' || celebrity.lastName AS celebrity_name, 
  count(e) AS distance
LIMIT 1000

可變長度邊緣綁定:

在可變長度模式中,邊緣變數會根據上下文擷取不同的資訊:

-- Edge variable 'e' binds to a single edge for each result row
MATCH (p:Person)-[e:knows]->(friend:Person)
RETURN p.firstName, e.creationDate, friend.firstName  -- e refers to one specific relationship
LIMIT 1000

-- Edge variable 'e' binds to a group list of all edges in the path
MATCH (p:Person)-[e:knows]->{2,4}(friend:Person)  
RETURN 
  p.firstName || ' ' || p.lastName AS person_name, 
  friend.firstName || ' ' || friend.lastName AS friend_name, 
  -- e is a list
  size(e) AS num_edges
LIMIT 1000

這種區別對於正確使用邊緣變數至關重要。

具有多個關係的複雜模式:

MATCH (p:Person), (p)-[:workAt]->(c:Company), (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, p.lastName, c.name AS company_name, city.name AS city_name
LIMIT 1000

這種模式會同時尋找人員及其工作場所和住所,顯示一個人如何與其他多個實體連線。

核心陳述

GQL 提供特定的語句類型,這些陳述式類型可以協同工作,逐步處理您的圖形資料。 理解這些陳述對於建立有效的查詢至關重要。

MATCH 陳述

Syntax:

MATCH <graph pattern>, <graph pattern>, ... [ WHERE <predicate> ]

MATCH 語句獲取輸入資料並尋找圖形模式,將輸入變數與模式變數連接並輸出所有匹配的組合。

輸入和輸出變數:

-- Input: unit table (no columns, one row)
-- Pattern variables: p, c  
-- Output: table with (p, c) columns for each person-company match
MATCH (p:Person)-[:workAt]->(c:Company)

使用 WHERE 進行陳述式層級篩選:

-- Filter pattern matches
MATCH (p:Person)-[:workAt]->(c:Company) WHERE p.lastName = c.name

所有相符項都可以使用 WHERE進行後過濾,避免單獨 FILTER 的陳述式。

使用輸入變數聯結:

當不是第一個陳述式時 MATCH ,它會將輸入資料與模式比對結合:

...
-- Input: table with 'targetCompany' column
-- Implicit join: targetCompany (equality join)
-- Output: table with (targetCompany, p, r) columns
MATCH (p:Person)-[r:workAt]->(targetCompany)

這很重要

Microsoft Fabric 中的圖形尚不支援任意陳述式組合。 請參閱 有關當前限制的文章。

關鍵加入行為:

如何 MATCH 處理資料聯結:

  • 變數相等:輸入變數使用相等匹配與模式變數結合
  • 內部聯結:捨棄沒有模式相符的輸入列(無左/右聯結)
  • 篩選順序:型樣比對完成後的陳述式層級 WHERE 篩選
  • 型樣連線能力:多個型樣必須至少共用一個變數,才能正確聯結
  • 效能:共用變數會建立有效率的聯結約束

這很重要

限制: 如果這 MATCH 不是第一個陳述式,則至少有一個輸入變數必須與型樣變數結合。 多個型樣必須有一個共同的變數。

多個模式需要共用變數:

-- Shared variable 'p' joins the two patterns
-- Output: people with both workplace and residence data
MATCH (p:Person)-[:workAt]->(c:Company), 
      (p)-[:isLocatedIn]->(city:City)

LET 陳述

Syntax:

LET <variable> = <expression>, <variable> = <expression>, ...

LET 陳述式會建立計算變數,並在查詢管線內啟用資料轉換。

基本變數建立:

MATCH (p:Person)
LET fullName = p.firstName || ' ' || p.lastName
RETURN *
LIMIT 1000

複雜的計算:

MATCH (p:Person)
LET adjustedAge = 2000 - (p.birthday / 10000),
    fullProfile = p.firstName || ' ' || p.lastName || ' (' || p.gender || ')'
RETURN *
LIMIT 1000

關鍵行為:

  • 會針對每個輸入列評估運算式
  • 結果會變成輸出表格中的新資料行
  • 變數只能參考先前陳述式中的現有變數
  • 一個 LET 中的多個分配會平行評估 (無交互參照)

FILTER 陳述

Syntax:

FILTER [ WHERE ] <predicate>

FILTER 陳述式可讓您精確控制哪些資料會透過查詢管線進行。

基本過濾:

MATCH (p:Person)
FILTER p.birthday < 19980101 AND p.gender = 'female'
RETURN *

複雜的邏輯條件:

MATCH (p:Person)
FILTER (p.gender = 'male' AND p.birthday < 19940101) 
  OR (p.gender = 'female' AND p.birthday < 19990101)
  OR p.browserUsed = 'Edge'
RETURN *

Null 感知篩選模式:

使用下列模式來安全地處理 Null 值:

  • 檢查值:p.firstName IS NOT NULL - 有名字
  • 驗證資料p.id > 0 - 有效身分證件
  • 處理遺失的資料NOT coalesce(p.locationIP, '127.0.0.1') STARTS WITH '127.0.0' - 未從本地網路連線
  • 組合條件AND/OR 與複雜邏輯的明確 null 檢查一起使用

謹慎

請記住,涉及空值的條件會傳回 UNKNOWN,這會篩選掉這些列。 當您需要包含 Null 的邏輯時,請使用明確 IS NULL 檢查。

ORDER BY 陳述

Syntax:

ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ...

使用計算表達式進行多級排序:

MATCH (p:Person)
RETURN *
ORDER BY p.firstName DESC,               -- Primary: by first name (Z-A)
         p.birthday ASC,                 -- Secondary: by age (oldest first)
         p.id DESC                       -- Tertiary: by ID (highest first)

排序中的空值處理:

ORDER BY coalesce(p.gender, 'not specified') DESC -- Treat NULL as 'not specified'

排序行為細節:

了解運作方式 ORDER BY

  • 運算式評估:針對每一列評估運算式,然後結果決定列順序
  • 多個排序鍵:建立分層排序(主要、次要、第三等)
  • Null 處理NULL 在比較中一律被視為最小值
  • 預設順序ASC (遞增)為預設, DESC 必須明確指定(遞減)
  • 計算排序:您可以按計算值排序,而不僅僅是儲存的屬性

謹慎

ORDER BY 建立的排序順序僅對 緊接的 陳述式可見。 因此, ORDER BY 後面的 不 RETURN * 會產生有序的結果。

比:

MATCH (a:Person)-[r:knows]->(b:Person)
LET aName = a.firstName || ' ' || a.lastName
LET bName = b.firstName || ' ' || b.lastName
ORDER BY r.creationDate DESC
/* intermediary result _IS_ guaranteed to be ordered here */
RETURN aName, bName, r.creationDate AS since
/* final result _IS_ _NOT_ guaranteed to be ordered here  */

取代為:

MATCH (a:Person)-[r:knows]->(b:Person)
LET aName = a.firstName || ' ' || a.lastName
LET bName = b.firstName || ' ' || b.lastName
/* intermediary result _IS_ _NOT_ guaranteed to be ordered here */
RETURN aName, bName, r.creationDate AS since
ORDER BY r.creationDate DESC
/* final result _IS_ guaranteed to be ordered here              */

這對「Top-k」查詢有直接影響: LIMIT 必須一律遵循 ORDER BY 建立預期排序順序的陳述式。

OFFSETLIMIT 語句

Syntax:

  OFFSET <offset> [ LIMIT <limit> ]
| LIMIT <limit>

常見模式:

-- Basic top-N query
MATCH (p:Person)
RETURN *
ORDER BY p.id DESC
LIMIT 10                                 -- Top 10 by ID

這很重要

如需可預測的分頁結果,請一律使用 ORDER BY before OFFSETLIMIT 以確保查詢之間的資料列順序一致。

RETURN:基本結果預測

Syntax:

RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
[ ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]

RETURN 陳述式會指定結果資料表中顯示哪些資料,以產生查詢的最終輸出。

基本輸出:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name, 
       p.birthday, 
       c.name

為了清楚起見,使用別名:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName AS first_name, 
       p.lastName AS last_name,
       c.name AS company_name

結合排序和top-k:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name, 
       p.birthday AS birth_year, 
       c.name AS company
ORDER BY birth_year ASC
LIMIT 10

使用 DISTINCT 進行重複處理:

-- Remove duplicate combinations
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN DISTINCT p.gender, p.browserUsed, p.birthday AS birth_year
ORDER BY p.gender, p.browserUsed, birth_year

結合彙總:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT p) AS employee_count

RETURN with GROUP BY:分組結果投影

Syntax:

RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
GROUP BY <variable>, <variable>, ...
[ ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]

GROUP BY 來依共用值將資料列分組,並在每個群組內計算彙總函數。

具有彙總的基本分組:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, 
       count(*) AS employeeCount,
       avg(p.birthday) AS avg_birth_year
GROUP BY companyName
ORDER BY employeeCount DESC

多欄分組:

MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
       browser,
       count(*) AS person_count,
       avg(p.birthday) AS avg_birth_year,
       min(p.creationDate) AS first_joined,
       max(p.id) AS highest_id
GROUP BY gender, browser
ORDER BY avg_birth_year DESC
LIMIT 10

備註

如需進階彙總技術,包括可變長度型樣的水平彙總,請參閱 進階彙總技術

資料類型:使用值

GQL 支援豐富的資料類型,用於在圖表中儲存和操作不同類型的資訊。

基本值類型:

  • 數字INT64UINT64、用於 DOUBLE 計算和測量
  • 文字STRING 用於名稱、描述和文字資料
  • 邏輯BOOL 具有三個值:TRUE、FALSE 和 UNKNOWN (用於 null 處理)
  • 時間ZONED DATETIME 用於帶有時區資訊的時間戳記
  • 集合LIST<T> 對多個相同類型的 T值, PATH 圖遍歷結果
  • 圖形元素NODE 以及 EDGE 用於引用圖形資料

這很重要

某些價值類型不被支援為財產價值類型。 特別地,所有涉及圖元素參考值的值都不能用作屬性值(例如節點或路徑的清單)。

範例文字:

42                                     -- Integer literal
"Hello, graph!"                        -- String  literal
TRUE                                   -- Boolean literal
ZONED_DATETIME('2024-01-15T10:30:00Z') -- DateTime with timezone literakl
[1, 2, 3]                              -- Literal list of integers

關鍵 Null 處理模式:

-- Equality predicates with NULL always returns UNKNOWN
5 = NULL                              -- Evaluates to UNKNOWN (not FALSE!)
NULL = NULL                           -- Evaluates to UNKNOWN (not TRUE!)

-- Use IS NULL predicates for explicit null testing
p.nickname IS NULL                    -- Evaluates to TRUE if nickname is null
p.nickname IS NOT NULL                -- Evaluates to TRUE if nickname has a value

-- Use the COALESCE function for null-safe value selection
coalesce(p.nickname, p.firstName, '???')  -- Evaluates to first non-null value

三值邏輯含義:

-- In FILTER statements, only TRUE values pass through
FILTER p.birthday > 0        -- Removes rows where birthday is null or missing or zero

-- It's important to understand that NOT UNKNOWN = UNKNOWN
FILTER NOT (p.birthday > 0)  -- Removes rows where birthday is null or missing or positive

-- Use explicit null handling for inclusive filtering
FILTER p.birthday < 19980101 OR p.birthday IS NULL -- Includes null birthdays

謹慎

三值邏輯意味著 NULL = NULL 返回 UNKNOWN,而不是 TRUE。 此行為會影響篩選和聯結。 一律用於 IS NULL 空值測試。

運算式:轉換和分析資料

運算式可讓您計算、比較和轉換查詢中的資料。 它們類似於 SQL 中的表達式,但具有處理圖形資料的額外功能。

常見的表達式類型:

p.birthday < 19980101   -- Birth year comparison  
p.firstName || ' ' || p.lastName               -- String concatenation
count(*)                                       -- Aggregation
p.firstName IN ['Alice', 'Bob']                -- List membership
coalesce(p.firstName, p.lastName)              -- Null handling

複雜的謂詞組成:

-- Combine conditions with proper precedence
FILTER (p.birthday > 19560101 AND p.birthday < 20061231) 
  AND ((p.gender IN ['male', 'female']) OR (p.browserUsed IS NOT NULL))

-- Use parentheses for clarity and correctness
FILTER p.gender = 'female' AND (p.firstName STARTS WITH 'A' OR p.id > 1000)

字串模式匹配:

-- Pattern matching with different operators
p.locationIP CONTAINS '192.168'      -- Substring search
p.firstName STARTS WITH 'John'       -- Prefix matching  
p.lastName ENDS WITH 'son'           -- Suffix matching

-- Case-insensitive operations
upper(p.firstName) = 'ALICE'         -- Convert to uppercase for comparison

按類別劃分的內建功能:

GQL 針對不同的資料處理需求提供了這些函數類別:

  • 聚合函數count()sum()avg()min()、, max() 用於彙總資料
  • 字串函數char_length()upper()lower()、用於 trim() 文字處理
  • 圖形函數nodes()edges()labels() 用於分析圖形結構
  • 一般函數coalesce() 用於正常處理空值

複雜運算式的運算子優先順序:

  1. 物業存取權 (.
  2. 乘法/除法 (*/
  3. 加法/減法 (+-
  4. 比較 (=<><><=>=, , )
  5. 邏輯否定 (NOT
  6. 邏輯連接詞 (AND
  7. 邏輯析取 (OR

在上述列表中,數字較低的運算子比數字較高的運算子「綁定得更緊密」。 範例: NOT n.prop OR m.prop(NOT n.prop) OR m.prop 但不是「NOT」(n.prop 或 m.prop)

小提示

使用括弧來明確表示優先順序。 當分組清晰時,複雜的運算式更容易閱讀和偵錯。

進階查詢技術

本節介紹用於建立複雜、高效的圖形查詢的複雜模式和技術。 這些模式超越基本陳述式用法,可協助您撰寫強大的分析查詢。

複雜的多語句組合

這很重要

Microsoft Fabric 中的圖形尚不支援任意陳述式組合。 請參閱 有關當前限制的文章。

了解如何有效地撰寫複雜的查詢對於進階圖形查詢至關重要。

多步驟模式進展:

-- Build complex analysis step by step
MATCH (company:Company)<-[:workAt]-(employee:Person)
LET companyName = company.name
MATCH (employee)-[:isLocatedIn]->(city:City)
FILTER employee.birthday < 19850101
LET cityName = city.name
RETURN companyName, cityName, avg(employee.birthday) AS avgBirthday, count(employee) AS employeeCount
GROUP BY companyName, cityName
ORDER BY avgBirthday DESC

這個查詢會逐漸增加複雜度:查找公司、員工、員工所在地、篩選1985年前出生員工的公司、計算平均生日,並彙整和排序結果。

水平聚合的使用:

-- Find people and their minimum distance to people working at Microsoft
MATCH TRAIL (p:Person)-[e:knows]->{,5}(:Person)-[:workAt]->(:Company { name: 'Microsoft'})
LET p_name = p.lastName || ', ' || p.firstName
RETURN p_name, min(count(e)) AS minDistance 
GROUP BY p_name
ORDER BY minDistance DESC

備註

這個查詢目前還不支援(已知問題)。

可變範圍和進階流量控制

變數跨查詢語句連接資料並啟用複雜的圖形遍歷。 瞭解進階範圍規則可協助您撰寫複雜的多語句查詢。

變數繫結和範圍模式:

-- Variables flow forward through subsequent statements 
MATCH (p:Person)                                    -- Bind p 
LET fullName = p.firstName || ' ' || p.lastName     -- Bind concatenation of p.firstName and p.lastName as fullNume
FILTER fullName CONTAINS 'Smith'                    -- Filter for fullNames with “Smith” substring (p is still bound)
RETURN p.id, fullName                               -- Only return p.id and fullName (p is dropped from scope) 

跨陳述式聯結的變數重複使用:

-- Multi-statement joins using variable reuse
MATCH (p:Person)-[:workAt]->(:Company)          -- Find people with jobs
MATCH (p)-[:isLocatedIn]->(:City)               -- Same p: people with both job and residence
MATCH (p)-[:knows]->(friend:Person)             -- Same p: their social connections
RETURN *

關鍵範圍規則和限制:

-- ✅ Backward references work
MATCH (p:Person)
LET adult = p.birthday < 20061231  -- Can reference p from previous statement
RETURN *

-- ❌ Forward references don't work  
LET adult = p.birthday < 20061231  -- Error: p not yet defined
MATCH (p:Person)
RETURN *

-- ❌ Variables in same LET statement can't reference each other
MATCH (p:Person)
LET name = p.firstName || ' ' || p.lastName,
    greeting = 'Hello, ' || name     -- Error: name not visible yet
RETURN *

-- ✅ Use separate statements for dependent variables
MATCH (p:Person)
LET name = p.firstName || ' ' || p.lastName
LET greeting = 'Hello, ' || name     -- Works: name now available
RETURN *

複雜查詢中的變數可見性:

-- Variables remain visible until overridden or query ends
MATCH (p:Person)                     -- p available from here
LET gender = p.gender                -- gender available from here  
MATCH (p)-[:knows]->(e:Person)       -- p still refers to original person
                                     -- e is new variable for managed employee
RETURN p.firstName AS manager, e.firstName AS friend, gender

謹慎

相同陳述式中的變數無法相互參考 (圖形模式除外)。 使用單獨的陳述式來建立應變數。

先進的聚合技術

GQL 支援兩種不同類型的彙總,用於跨群組和集合分析資料:垂直 GROUP BY 彙總和可變長度模式的水平彙總。

使用 GROUP BY 進行垂直彙總

垂直彙總(涵蓋於RETURNGROUP BY)會依共用值將資料列分組,並計算每個群組內的彙總:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN c.name AS companyName, 
       count(*) AS employee_count, 
       avg(p.birthday) AS avg_birth_year
GROUP BY companyName

此方法會為每個公司建立一個結果列,彙總每個群組內的所有員工。

具有群組清單變數的水平彙總

水平彙總會計算受可變長度模式所系結之集合的彙總。 當您使用可變長度邊時,邊變數會變成群組 清單變數 ,以保留每個相符路徑中的所有邊:

-- Group list variable 'edges' enables horizontal aggregation
MATCH (p:Person)-[edges:knows]->{2,4}(friend:Person)
RETURN p.firstName || ' ' || p.lastName AS person_name, 
       friend.firstName || ' ' || friend.lastName AS friend_name,
       size(edges) AS degrees_of_separation,
       avg(edges.creationDate) AS avg_connection_age,
       min(edges.creationDate) AS oldest_connection

備註

這個查詢目前還不支援(已知問題)。

主要差異:

  • 垂直彙總會 跨列摘要 - 或 - 將列分組,並跨每個群組中的列摘要
  • 水平彙總 會彙總個別邊緣集合中的元素
  • 群組清單變數僅來自可變長度邊緣模式

可變長度邊緣繫結內容

了解邊緣變數如何在可變長度模式中綁定至關重要:

在模式比對期間(單例上下文):

-- Edge variable 'e' refers to each individual edge during filtering
MATCH (p:Person)-[e:knows WHERE e.creationDate > zoned_datetime('2000-01-01T00:00:00Z')]->{2,4}(friend:Person)
-- 'e' is evaluated for each edge in the path during matching
RETURN *

在結果運算式 (群組內容) 中:

-- Edge variable 'edges' becomes a list of all qualifying edges
MATCH (p:Person)-[e:knows]->{2,4}(friend:Person)
RETURN size(e) AS num_edges,                    -- Number of edges in path
       e[0].creationDate AS first_edge,         -- First edge in path
       avg(e.creationDate) AS avg_age           -- Horizontal aggregation

備註

這個查詢目前還不支援(已知問題)。

結合垂直和水平聚合

您可以在複雜的分析模式中結合這兩種聚集類型:

-- Find average connection age by city pairs
MATCH (p1:Person)-[:isLocatedIn]->(c1:City)
MATCH (p2:Person)-[:isLocatedIn]->(c2:City)
MATCH (p1)-[e:knows]->{1,3}(p2)
RETURN c1.name AS city1,
       c2.name AS city2,
       count(*) AS connection_paths,                  -- Vertical: count paths per city pair
       avg(size(e)) AS avg_degrees,                   -- Horizontal then vertical: path lengths
       avg(avg(e.creationDate)) AS avg_connection_age -- Horizontal then vertical: connection ages
GROUP BY city1, city2

備註

這個查詢目前還不支援(已知問題)。

小提示

水平彙總一律優先於垂直彙總。 若要將群組清單轉換為一般清單,請使用 collect_list(edges)

備註

如需詳細的彙總函數參考,請參閱 GQL 運算式和函數

錯誤處理策略

了解常見的錯誤模式有助於您撰寫健全的查詢。

正常處理遺失的資料:

MATCH (p:Person)
-- Use COALESCE for missing properties
LET displayName = coalesce(p.firstName, p.lastName, 'Unknown')
LET contact = coalesce(p.locationIP, p.browserUsed, 'No info')
RETURN *

使用明確的 Null 檢查:

MATCH (p:Person)
-- Be explicit about null handling
FILTER p.id IS NOT NULL AND p.id > 0
-- Instead of just: FILTER p.id > 0
RETURN *

其他資訊

GQL狀態碼

查詢結果一節所述,GQL 會報告與執行成功或潛在失敗相關的豐富狀態資訊。 如需完整清單,請參閱 GQL 狀態碼參考。

保留字詞

GQL 會保留某些您無法用作識別碼的關鍵字,例如變數、屬性名稱或標籤名稱。 如需完整清單,請參閱 GQL 保留字組參考

如果您需要使用保留字作為標識符,請使用反引號轉義它們: `match``return`

若要避免逸出保留字,請使用此命名慣例:

  • 對於單字識別碼,請附加底線: :Product_
  • 對於多字標識符,請使用駝峰命名法或帕斯卡命名法: :MyEntity:hasAttributetextColor

後續步驟

現在您已經了解了 GQL 基礎知識,以下是您推薦的學習路徑:

繼續培養您的 GQL 技能

對於初學者:

對於有經驗的用戶:

參考資料

將這些參考資料放在手邊以便快速查找:

探索 Microsoft Fabric

了解平台:

積極參與

  • 分享意見反應 - 協助改善我們的文件和工具
  • 加入社區 - 與其他圖數據庫從業者聯繫
  • 保持更新 - 關注 Microsoft Fabric 公告以獲取新功能

小提示

如果您偏好邊做邊學,請從 快速入門教學課程 開始,如果您想要先掌握查詢語言,請深入瞭解 圖形模式

有關關鍵主題的更多詳細信息:

快速參考:

Microsoft Fabric 中的圖形: