在 Microsoft Fabric 中撰寫圖形模式查詢

圖型匹配讓你能用直覺且視覺化的語法描述你想找到的資料結構。 你不是連接表格,而是寫出看起來像是關係本身的模式——節點由邊連接。 本文將指導您如何在 Microsoft Fabric 中撰寫 GQL 樣式查詢,以應對圖形中常見的情境。

範例中使用社群網路範例資料集。 完整模式語法參考,請參見 GQL 圖形模式

先決條件

  • 一個已載入資料的圖項目。 如果你是圖形新手,建議先完成 教學
  • 熟悉基礎 MATCHRETURN 查詢。 請參閱 GQL 語言指南

匹配直接關係

基本模式會匹配節點類型、特定邊型態及另一種節點類型。 語法看起來像是關係的示意圖。

例如,要將最多 100 人與其所屬公司配對:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100

當你不知道或不在意方向時,可以用無向邊緣圖案。 例如,無論誰發起連結,最多可找到100位共同熟人:

MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100

Note

Graph 目前不支援建立無向邊,但你可以用 -[:label]- 語法查詢任意方向的邊。

帶有內聯 WHERE 的過濾模式

在匹配過程中,將 WHERE 放入圖案內以過濾節點和邊。 這種方法比事後過濾更有效率。

例如,要找到1990年前出生,且在名稱以「A」開頭的公司工作的人:

MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

依據邊屬性過濾,以限制符合條件的關係。 例如,只申報2010年或之後開始在公司工作的人員:

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom

匹配多跳關係

使用可變長度的模式在一個表達式中遍歷多個跳點。 使用 {min,max} 語法來指定最小和最大跳數。

例如,要找到多達100名能夠被聯繫的人,這些人在愛麗絲朋友互動的兩到四層級之內:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

要尋找從 Alice 開始最多 100 個直接和二級連結(一或兩次跳躍):

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

使用路徑模式控制遍歷

預設情況下,GQL 使用 TRAIL 模式,防止同一條邊緣被穿越超過一次。 當你需要不同的保證時,明確使用路徑模式。

路徑模式 行為 使用時機...
WALK 允許重複節點與邊 你想要的是純粹的移動,沒有限制。 很少需要;主要用於探索性查詢。
TRAIL 沒有重複邊(預設) 你想避免重溯相同的關係,但同一個節點可能會透過不同的關係出現。 這對大多數遍歷查詢都很有效。
SIMPLE 除了起始和結束外,沒有重複節點 你不希望路徑中間的節點不應重複出現,但可以允許路徑回到起點。 這對於偵測迴圈很有用。
ACYCLIC 完全沒有重複的節點 你需要確保路徑上沒有任何節點出現超過一次。 用於嚴謹的階層結構、分支,或任何重複訪問節點會產生錯誤結果的遍歷。

WALK 是最寬鬆且 ACYCLIC 限制最嚴格的模式。 TRAIL 是預設,且對大多數查詢都運作良好。 只有在你的使用情境需要時,才使用較嚴格的模式。

為了說明差異,請考慮《愛麗絲→鮑勃》→《卡蘿》→鮑勃的路徑:

  • WALK — 允許這條路徑。 節點與邊可以自由重複。
  • TRAIL — 允許此路徑。 Bob 出現兩次,但每次邊的關係都不同(Alice→Bob 和 Carol→Bob 是不同的邊),因此不會重複邊。
  • 簡單 — 阻擋這條路。 Bob 出現不只一次,SIMPLE 只允許某節點在成為路徑的起點和終點(形成封閉路徑循環)時才可重複。 這裡愛麗絲是開始,鮑勃是終點,所以沒有例外。
  • 無循環 — 阻擋這條路徑。 鮑勃在路徑上出現過不只一次。

以下範例展示了如何使用TRAIL來計算在四跳之內通往 Alice 網路中前 100 位可達成員的不同路徑數量:

MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100

可返回 ACYCLIC 最多100名可從愛麗絲在四跳內抵達的人,且路徑上的每個人都是獨一無二的:

MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

Tip

對於大型圖,必須對可變長度的模式設上限({1,4} 而非 {1,})。 密集圖間的無界遍歷可能會觸及查詢逾時限制。 請參見 目前的限制

利用變數的重複使用來表達共享對象

在模式的兩個部分重複使用同一變數會產生隱含的等號限制——兩個參考必須匹配於同一個節點。 這個技巧讓你能表達「透過共享的第三實體尋找連結的實體」。

例如,要找到最多100對彼此認識且在同一家公司工作的人的步驟如下:

MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100

變數 c 會重複用於兩個 workAt 目標,因此查詢只會回傳雙方彼此認識 在同一家公司工作的配對。

要找到多達100對同時按讚同一貼文的人:

MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100

Tip

WHERE a.id < b.id 條件防止重複配對(Alice + Bob 與 Bob + Alice)出現在結果中。

結合多種圖案

在一個 MATCH中列出多個模式,中間用逗號分隔。 所有模式必須至少共享一個變數,才能正確結合。

例如,要找到最多100人及其工作地點及居住城市:

MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100

共享變數 p 連接了這兩個模式。 每一列結果代表一個人及其公司和城市。

配對可選關係

若每個節點不一定都存在關係,請使用 OPTIONAL MATCH。 沒有匹配的行會保留 NULL 的值,這類似於 SQL 的 LEFT JOIN

例如,回傳最多100個人,並顯示他們的公司名稱,其中包括那些公司欄位顯示NULL的無雇主者:

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100

使用 IS NULL After OPTIONAL MATCH 可以找到最多 100 位不在任何公司工作的員工:

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100