篩選可以將結果縮小到重要的欄位。 聚合會將這些數據列彙整成計數、總數和平均值。 本文將示範如何在 Microsoft Fabric 中的 GQL 查詢中應用這兩種技術於圖形資料上。
範例使用 社群網路範例資料集。 欲了解 GQL 語句與表達式的完整參考,請參閱 GQL 語言指南。
先決條件
使用 FILTER 篩選資料列
請使用 FILTER 來保留符合條件的行。 在FILTER後放置MATCH以縮小匹配結果。
以下查詢會回傳所有女性的姓名和生日:
MATCH (p:Person)
FILTER p.gender = 'female'
RETURN p.firstName, p.lastName, p.birthday
將多個條件與AND和OR結合。 例如,以下查詢會回傳1990年前出生的所有女性姓名:
MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName
Tip
為了提升效能,建議在模式匹配時使用內嵌 WHERE 子句來過濾,而不是在獨立 FILTER 的語句中。 請參見 模式匹配中的過濾器。
模式匹配時的過濾器
在WHERE模式中的MATCH嵌入子句會限制哪些節點和邊會在產生任何結果之前先被匹配。 此方法比事後匹配 FILTER 子句更有效率,因為查詢引擎會提前修剪列數。
例如,要找出1994年前出生的人及其所在公司,並將結果限制為名稱以「A」開頭的公司:
MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name
過濾邊緣屬性也是用同樣方式。 例如,只回放2000年或之後開始在公司工作的人員:
MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom
關於內嵌過濾與賽後過濾的效能差異,請參見 優化 GQL 查詢效能。
在濾波器中處理空值
GQL 採用三值邏輯:謂詞評估結果為 TRUE、FALSE 或 UNKNOWN。 當屬性值為零時,比較會回傳 UNKNOWN。
FILTER 會 UNKNOWN 被視為不匹配,因此該列被排除。
使用 IS NULL 和 IS NOT NULL 明確測試空值:
-- Only include people who have a nickname
MATCH (p:Person)
FILTER p.nickname IS NOT NULL
RETURN p.firstName, p.nickname
當屬性可能為空時,請用 coalesce() 替換預設值:
MATCH (p:Person)
RETURN p.firstName, coalesce(p.nickname, p.firstName) AS displayName
Caution
NULL = NULL 評估為 UNKNOWN,不是 TRUE。 一定要用 IS NULL 來測試空值,而不是等式。
使用 RETURN 取得綜合結果
使用總和函數在RETURN中總結你的結果。 GQL 支援 count()、sum()、avg()、min() 和 max()。
例如,計算圖表中的所有人數:
MATCH (p:Person)
RETURN count(*) AS totalPeople
為了計算不同價值,例如有多少家不同公司雇用了員工:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT c) AS companyCount
使用 GROUP BY 來分組結果
使用 GROUP BY 並在 RETURN 中按共享值為資料列分組,然後在每個群組內計算彙總數據。 此群組即為 GQL 中相當於 SQL GROUP BY的 。
例如,計算每家公司員工數:
MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, count(*) AS employeeCount
GROUP BY companyName
ORDER BY employeeCount DESC
依多欄分組,並同時計算多個聚合。 例如,將人數和生日範圍依性別和瀏覽器分類,回傳 10 種最常見的組合:
MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
browser,
count(*) AS personCount,
min(p.birthday) AS earliestBirthday,
max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10
Note
所有非 RETURN 聚合表達式必須出現在 GROUP BY中。 不在 GROUP BY 中的表達式必須使用聚合函數。
排序並限制彙總結果
使用 ORDER BY 和 LIMIT 搭配 GROUP BY 來尋找前N名的結果。
例如,要找到依居民數量排名前五的城市:
MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityName = city.name
RETURN cityName, count(*) AS residentCount
GROUP BY cityName
ORDER BY residentCount DESC
LIMIT 5
這很重要
將ORDER BY放在LIMIT之前。
LIMIT 總是適用於已排序的結果集。
在結果中使用 CASE 指令來設定條件值
用來CASE/WHEN/THEN/ELSE計算條件RETURN值 或 。LET
例如,根據出生年份將人分類為不同時代:
MATCH (p:Person)
RETURN p.firstName,
CASE WHEN p.birthday < 19800101 THEN 'Before 1980'
WHEN p.birthday < 20000101 THEN '1980–1999'
ELSE '2000 or later'
END AS era