本文提供 Microsoft Fabric 常見圖形任務的實用 GQL 查詢模式:尋找鄰居、遍歷多跳連線、識別共享連線、計數關係,以及尋找無連接的實體。
範例使用 社群網路範例資料集。 完整語言參考,請參閱 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 BY 和 count(*) 計算每個實體擁有多少關係。
數每個人有多少朋友,依序從多到少:
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 BY 並 FILTER 識別高度連結的節點。 此方法有助於尋找樞紐或離群值。
尋找有超過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。 它會過濾彙整結果,而不是單一列。