
3.3.5 Aggregation语句
3.3.5.1 简介
Cypher支持使用聚合(Aggregation)来计算聚在一起的数据,类似SQL中的group by。聚合函数有多个输入值,然后基于它们计算出一个聚合值。例如,avg函数计算多个数值的平均值。min函数用于找到一组值中最小的那个值。
聚合可以在匹配到的子图上进行计算。非聚合的表达式将值聚集起来,然后放入聚合函数。
以下面的返回语句为例:

这里有两个表达式:n和count()。前者n不是聚合函数,是一个分组键。后者count()是一个聚合函数。因此,根据不同的分组键(Grouping Key),匹配的子图将被分为不同的组。聚合函数将运行在这些组上来计算聚合值。
下面的例子对理解聚合很有帮助,该查询基于如图3-9所示的数据。

图3-9 查询例子的数据
查询:

在这个例子中,试图找到朋友的所有朋友并计算朋友的个数。第一个count(DISTINCT friend_of_friend)聚合函数中每个friend_of_friend只会计算一次,因为DISTINCT剔除了重复的部分。第二个聚合函数中,每个friend_of_friend会被计算多次。当没有使用DISTINCT时,因为B和C都认识D,因此D被计算了两次。
结果:

聚合图例如图3-10所示。

图3-10 聚合图例
3.3.5.2 count
count用于计算行的数量。count有两种使用方式:count(*)用于计算匹配的行数,而count(<expression>)用于计算<expression>中非空值的数量。
1.计算节点
计算节点的数量。例如:如果要计算连接到某个节点的节点数,可用count(*),示例如下。
查询:

结果将返回起始节点及与之相连节点的数量。
结果:

2.按组计算关系类型的数量
计算关系类型组中的数量,返回类型和数量。
查询:

结果将返回关系类型和关系组中的关系数量。
结果:

3.计算实体
除了通过count(*)计算结果的数量,还可以加入name值。
查询:

结果将返回与满足带有name属性值为A的节点相连的所有节点的数量。
结果:

4.计算非空值的数量
可以通过count(expression)来计算非空值的数量。
查询:

结果将返回property属性非空的所有节点。
结果:

3.3.5.3 统计
1.sum可以通过聚合函数sum计算所有值之和。计算的时候,空值将被丢弃。
查询:

结果将返回包含Person标签的所有节点的property属性值之和。
结果:

2.avg
avg计算数值列的平均值。
查询:

结果将返回property属性值的平均值。
结果:

3.percentileDisc
percentileDisc计算给定值在一个组中的百分位,取值从0.0~1.0。它使用舍入法,返回最接近百分位的值。对于插值法,请参考percentileCont函数。
查询:

结果:

4.percentileCont
percentileCont计算给定值在一个组中的百分位,百分位的值从0.0~1.0。它采用线性插值的方法,在两个值之间计算一个加权平均数。对于使用舍入法获取最近的值,请参考percentileDisc函数。
查询:

结果:

5.stdev
stdev计算给定值在一个组中的标准偏差。它采用标准的two-pass方法,以N-1作为分母。当以部分样本作为无偏估计时,应使用stdev;当计算整个样本的标准偏差时,应使用stdevp。
查询:

结果:

6.stdevp
stdevp计算给定值在一个组中的标准偏差。与stdev类似,区别如上所述。
查询:

结果:

7.max
max查找数值列中的最大值。
查询:

结果将返回property属性中的最大值。
结果:

8.min
min查找数值列中的最小值。
查询:

结果将返回property属性中的最小值。
结果:

3.3.5.4 collect
collect将所有的值收集起来放入一个列表,空值null将被忽略。
查询:

结果将以列表的形式返回收集到的值。
结果:

3.3.5.5 DISTINCT
所有的聚合函数都可以带有DISTINCT修饰符,它将去掉其中的重复值。因此,计算节点中不重复眼睛颜色数量的查询可以这样写:
查询:

结果:
