在 Microsoft Fabric 中撰寫常見的 GQL 查詢

本文提供 Microsoft Fabric 常見圖形任務的實用 GQL 查詢模式:尋找鄰居、遍歷多跳連線、識別共享連線、計數關係,以及尋找無連接的實體。

範例使用 社群網路範例資料集。 完整語言參考,請參閱 GQL語言指南

先決條件

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

尋找直接鄰居

回傳所有與起始節點一跳連接的節點。

找出特定個人認識的所有人:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName

查找該人曾任職的所有公司:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:workAt]->(c:Company)
RETURN c.name, c.url

尋找朋友的朋友(多層網絡)

使用可變長度的模式 {min,max} 來穿越多次跳躍。

找出二度關係的人——這些人是愛麗絲朋友的朋友,但愛麗絲並不直接認識。

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

找到能在三度內聯絡到的每個人:

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

Tip

務必為可變長度遍歷設定上限。 跨越大型或密集圖的無界模式可能會達到查詢逾時限制。 請參見 目前的限制

計算每個實體的關係數量

GROUP BYcount(*) 計算每個實體擁有多少關係。

數每個人有多少朋友,依序從多到少:

MATCH (p:Person)-[:knows]->(friend:Person)
LET name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY name
ORDER BY friendCount DESC
LIMIT 20

計算每家公司有多少員工:

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

尋找共享連結

在模式的兩個部分重複使用變數會產生隱含的「同一節點」限制。 利用此限制尋找透過共享第三實體連接的實體。

找一對彼此都認識同一個人的人:

MATCH (a:Person)-[:knows]->(mutual:Person)<-[:knows]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, mutual.firstName AS sharedContact
LIMIT 100

請尋找在同一家公司工作的人員組成配對:

MATCH (c:Company)<-[:workAt]-(a:Person), (c)<-[:workAt]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, c.name AS company
LIMIT 100

Tip

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

尋找沒有關係的實體

使用 OPTIONAL MATCH 後接空檢查,以尋找沒有匹配關係的節點。

查找未在任何公司工作的人:

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

尋找無留言的貼文:

MATCH (post:Post)
OPTIONAL MATCH (comment:Comment)-[:replyOf]->(post)
FILTER comment IS NULL
RETURN post.id, post.content
LIMIT 100

尋找有許多關聯的實體

合併 GROUP BYFILTER 識別高度連結的節點。 此方法有助於尋找樞紐或離群值。

尋找有超過10個朋友的人:

MATCH (p:Person)-[:knows]->(friend:Person)
LET name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY name
FILTER friendCount > 10
ORDER BY friendCount DESC

Note

在 SQL 中,FILTER 之後 GROUP BY 的運作方式就像 HAVING。 它會過濾彙整結果,而不是單一列。