最近更新时间:2025-11-11 16:29:40
在 Cypher 中,聚合操作(Aggregation) 用于对多行数据进行分组计算,并返回汇总结果。常见聚合包括计数、求和、平均值、最小值与最大值等。
通常,聚合函数以 aggr(expr) 的形式使用,用于处理在输入记录中针对每个聚合键(aggregation key)找到的所有匹配行。聚合键之间的比较遵循 等价性(Equivalency) 规则(详见可比性与相等性章节)。
在常规聚合中(即 aggr(expr) 形式),聚合值列表是候选值列表,其中所有空值都被移除。
以下示例初始化一组节点与关系,用于演示 Cypher 聚合操作。
SELECT * FROM cypher('graph_name', $$
CREATE (a:Person {name: 'A', age: 13}),
(b:Person {name: 'B', age: 33, eyes: "blue"}),
(c:Person {name: 'C', age: 44, eyes: "blue"}),
(d1:Person {name: 'D', eyes: "brown"}),
(d2:Person {name: 'D'}),
(a)-[:KNOWS]->(b),
(a)-[:KNOWS]->(c),
(a)-[:KNOWS]->(d1),
(b)-[:KNOWS]->(d2),
(c)-[:KNOWS]->(d2)
$$) as (a agtype);Cypher 提供的聚合机制与 SQL 的 GROUP BY 类似,用于在查询中对匹配结果进行分组并计算聚合值。
聚合函数接受一组值并计算它们的聚合值。例如:
avg():计算多个数值的平均值
min() :返回一组值中的最小值(数值或字符串)
当我们说聚合函数“对一组值进行操作”时,指的是该函数将内部表达式(如 n.age)应用到同一聚合组中所有记录的结果集上。
聚合可以在所有匹配的子图上计算,或者可以通过引入分组键进一步划分。这些是非聚合表达式,用于对进入聚合函数的值进行分组。
例如,如下查询统计每个名称(name)对应的节点数量:
SELECT * FROM cypher('graph_name', $$
MATCH (v:Person)
RETURN v.name AS grouping_key, count(*) AS count
$$) AS (grouping_key agtype, count agtype);查询结果:
count | key |
A | 1 |
B | 1 |
C | 1 |
D | 2 |
4 row |
在该示例中:
grouping_key 为分组键(非聚合表达式)
count(*) 为聚合函数
查询执行流程如下:
匹配所有带有 Person 标签的节点;
按 name 对节点分组;
对每个分组计算 count(*);
输出每组对应的节点数量。
最终,所有匹配的子图将根据 grouping_key 被划分为独立分组桶(bucket),聚合函数将在每个分组内运行并生成聚合结果。
在 Cypher 中,若要对聚合结果进行排序,必须在 RETURN 子句中显式包含聚合表达式。这是因为只有返回结果中的聚合字段才能在 ORDER BY 中被引用。
SELECT *
FROM cypher('graph_name', $$
MATCH (me:Person)-[]->(friend:Person)
RETURN count(friend), me
ORDER BY count(friend)
$$) as (friends agtype, me agtype);在去重聚合中(即 aggr(DISTINCT expr) 形式),聚合值列表是候选值列表,其中所有空值都被移除。此外,在去重聚合中,所有等价候选值中只有一个包含在聚合值列表中,即等价下的重复项被移除。
DISTINCT 操作符与聚合一起工作。它用于在通过聚合函数运行之前使所有值唯一。
SELECT *
FROM cypher('graph_name', $$
MATCH (v:Person)
RETURN count(DISTINCT v.eyes), count(v.eyes)
$$) as (distinct_eyes agtype, eyes agtype);distinct_eyes | eyes |
2 | 3 |
1 row |
纯净模式
