Microsoft Fabric 中的圖形資料過濾與彙整

篩選可以將結果縮小到重要的欄位。 聚合會將這些數據列彙整成計數、總數和平均值。 本文將示範如何在 Microsoft Fabric 中的 GQL 查詢中應用這兩種技術於圖形資料上。

範例使用 社群網路範例資料集。 欲了解 GQL 語句與表達式的完整參考,請參閱 GQL 語言指南

先決條件

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

使用 FILTER 篩選資料列

請使用 FILTER 來保留符合條件的行。 在FILTER後放置MATCH以縮小匹配結果。

以下查詢會回傳所有女性的姓名和生日:

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

將多個條件與ANDOR結合。 例如,以下查詢會回傳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 採用三值邏輯:謂詞評估結果為 TRUEFALSEUNKNOWN。 當屬性值為零時,比較會回傳 UNKNOWNFILTERUNKNOWN 被視為不匹配,因此該列被排除。

使用 IS NULLIS 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 BYLIMIT 搭配 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