筛选和聚合Microsoft Fabric中的图形数据

注释

此功能目前处于公开预览状态。 此预览版在没有服务级别协议的情况下提供,不建议用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

筛选将结果缩小到重要的行。 聚合将这些行汇总为计数、总计和平均值。 本文介绍如何在 GQL 查询中针对 Microsoft Fabric 中的图形应用这两种技术。

示例使用 社交网络示例数据集。 有关 GQL 语句和表达式的完整参考,请参阅 GQL 语言指南

先决条件

  • 加载数据的图形项。 如果你不熟悉图形,请先完成 本教程
  • 熟悉 MATCHRETURN 的基本查询。 请参阅 GQL 语言指南

使用 FILTER 筛选行

使用 FILTER 仅保留满足条件的行。 放置 FILTERMATCH 以缩小匹配结果的范围。

以下查询返回所有女性的姓名和生日:

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 语句中进行筛选。 请参阅 模式匹配期间的筛选器

在模式匹配期间进行筛选

MATCH模式中的WHERE内联子句限制了在生成任何结果之前匹配的节点和边。 此方法比匹配 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 查询性能

处理筛选器中的 null 值

GQL 使用三值逻辑:谓词的计算结果是TRUEFALSEUNKNOWN。 当属性值为 null 时,比较返回 UNKNOWNFILTER 视为 UNKNOWN 不匹配,因此排除该行。

使用 IS NULLIS NOT NULL 来明确测试 null 值:

-- Only include people who have a nickname
MATCH (p:Person)
FILTER p.nickname IS NOT NULL
RETURN p.firstName, p.nickname

当属性可能为 null 时,用于 coalesce() 替换默认值:

MATCH (p:Person)
RETURN p.firstName, coalesce(p.nickname, p.firstName) AS displayName

注意

NULL = NULL 计算结果为 UNKNOWN,而不是 TRUE。 始终使用 IS NULL 来测试 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 对结果进行分组

RETURN中使用GROUP BY,以共享值对行进行分组,并在每个组内计算聚合。 此分组是 SQL GROUP BY的 GQL 等效项。

例如,若要对每个公司的员工进行计数:

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

注释

所有 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/ELSERETURNLET中计算条件值。

例如,根据他们的出生年将人们分类为时代:

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