Cypher中的group by功能实现

发布时间 2023-08-09 10:30:41作者: bonelee

Cypher 语言并没有原生的 GROUP BY 关键字,但聚合函数(例如 COUNT)隐含地引入了分组。

 

https://neo4j.com/docs/cypher-manual/current/functions/aggregating/#grouping-key-examples

聚合函数采用一组值并计算它们的聚合值。可以对所有匹配路径进行聚合计算,也可以通过引入分组键来进一步划分。分组键是非聚合表达式,用于对进入聚合函数的值进行分组。

例如,假设以下查询包含两个返回表达式ncount(*)

 
RETURN n, count(*)

第一个n不是聚合函数,因此它将是分组键。后者count(*)是一个聚合表达式。根据分组键,匹配的路径将被分为不同的桶。然后,聚合函数将在这些存储桶上运行,计算每个存储桶的聚合值。

用于count(*)对关系类型进行分组和计数

该函数count(*)可用于对匹配关系的类型进行分组并返回类型的数量。

示例 5.count()
询问
MATCH (p:Person {name: 'Keanu Reeves'})-[r]->()
RETURN type(r), count(*)

对匹配的关系类型进行分组,并返回关系类型的组数:

表 5. 结果
类型(r)数数(*)

"ACTED_IN"

1

"KNOWS"

3

行数:2

 

有重复和无重复的计数

此示例尝试查找 的朋友的所有朋友Keanu Reeves并对其进行计数。

count(DISTINCT friendOfFriend)

只会计算friendOfFriend一次,因为DISTINCT会删除重复项。

count(friendOfFriend)

friendOfFriend多次考虑同样的事情。

示例 7.count()
询问
MATCH (p:Person)-->(friend:Person)-->(friendOfFriend:Person)
WHERE p.name = 'Keanu Reeves'
RETURN friendOfFriend.name, count(DISTINCT friendOfFriend), count(friendOfFriend)

节点Carrie Anne MossLiam Neeson都与 具有传出KNOWS关系Guy PearceGuy Pearce因此,当不使用 时,该节点将被计数两次DISTINCT

表 7. 结果
朋友的朋友.name计数(不同的朋友的朋友)计数(朋友的朋友)

"Guy Pearce"

1

2

 

https://stackoverflow.com/questions/52722671/how-to-make-group-by-in-a-cypher-query