聚合函数

触发自动聚合的函数。

数据准备

LOAD 'age';
SET search_path TO ag_catalog;

SELECT create_graph('graph_name');

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);

min

min() 返回一组值中的最小值。

语法:min(expression)

返回值:

属性类型或列表,取决于 expression 返回的值。

参数:

名称 描述
expression 返回包含任意属性类型和列表组合的集合的表达式。

注意事项:

  • 任何 null 值都会从计算中排除。
  • 在混合集合中,任何字符串值始终被认为低于任何数值,任何列表始终被认为低于任何字符串。
  • 列表按字典序比较,即列表元素从头到尾按升序逐对比较。
  • min(null) 返回 null。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (v:Person)
    RETURN min(v.age)
$$) as (min_age agtype);

返回属性 age 中所有值的最小值。

结果:

min_age
13
返回 1 行

min() 与列表一起使用

数据准备:

为了说明以下示例,假设先运行以下三个命令:

SELECT * FROM cypher('graph_name', $$
    CREATE (:min_test {val:'d'})
$$) as (result agtype);

SELECT * FROM cypher('graph_name', $$
    CREATE (:min_test {val:['a', 'b', 23]})
$$) as (result agtype);

SELECT * FROM cypher('graph_name', $$
    CREATE (:min_test {val:[1, 'b', 23]})
$$) as (result agtype);

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (v:min_test)
    RETURN min(v.val)
$$) as (min_val agtype);

返回集合中所有值的最小值——在本例中为列表 ['a', 'b', 23]——因为 (i) 两个列表被认为比字符串 "d" 的值更低,(ii) 字符串 "a" 被认为比数值 1 的值更低。

结果:

min_age
["a", "b", 23]
返回 1 行

max

max() 返回一组值中的最大值。

语法:max(expression)

返回值:

属性类型或列表,取决于 expression 返回的值。

参数:

名称 描述
expression 返回包含任意属性类型和列表组合的集合的表达式。

注意事项:

  • 任何 null 值都会从计算中排除。
  • 在混合集合中,任何数值始终被认为高于任何字符串值,任何字符串值始终被认为高于任何列表。
  • 列表按字典序比较,即列表元素从头到尾按升序逐对比较。
  • max(null) 返回 null。

查询:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN max(n.age)
$$) as (max_age agtype);

返回属性 age 中所有值的最大值。

结果:

max_age
44
返回 1 行

stDev

stDev() 返回给定值在一组数据上的标准差。它使用标准的两遍方法,以 N - 1 作为分母,适用于从总体中抽取样本进行无偏估计。当计算整个总体的标准差时,应使用 stDevP

语法:stDev(expression)

返回值:

agtype 浮点数。

参数:

名称 描述
expression agtype 数值表达式

注意事项:

  • 任何 null 值都会从计算中排除。
  • stDev(null) 返回 0.0(零)。

查询

SELECT *
FROM cypher('graph_name', $$
   MATCH (n:Person)
   RETURN stDev(n.age)
$$) as (stdev_age agtype);

返回属性 age 中值的标准差。

结果:

stdev_age
15.716233645501712
返回 1 行

stDevP

stDevP() 返回给定值在一组数据上的标准差。它使用标准的两遍方法,以 N 作为分母,适用于计算整个总体的标准差。当仅计算总体样本的标准差时,应使用 stDev

语法:stDevP(expression)

返回值:

agtype 浮点数。

参数:

名称 描述
expression agtype 数值表达式

注意事项:

  • 任何 null 值都会从计算中排除。
  • stDevP(null) 返回 0.0(零)。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN stDevP(n.age)
$$) as (stdevp_age agtype);

返回属性 age 中值的总体标准差。

结果:

stdevp_age
12.832251036613439
返回 1 行

percentileCont

percentileCont() 返回给定值在一组数据上的百分位数,百分位数范围从 0.0 到 1.0。它使用线性插值方法,如果所需百分位数位于两个值之间,则计算加权平均值。要使用四舍五入方法获取最近值,请参阅 percentileDisc

语法:percentileCont(expression, percentile)

返回值:

agtype 浮点数。

参数:

名称 描述
expression agtype 数值表达式
percentile 0.0 到 1.0 之间的 agtype 数值

注意事项:

  • 任何 null 值都会从计算中排除。
  • percentileCont(null, percentile) 返回 null。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN percentileCont(n.age, 0.4)
$$) as (percentile_cont_age agtype);

返回属性 age 中值的第 40 百分位数,使用加权平均值计算。

结果:

percentile_cont_age
29.0
返回 1 行

percentileDisc

percentileDisc() 返回给定值在一组数据上的百分位数,百分位数范围从 0.0 到 1.0。它使用四舍五入方法,计算最接近百分位数的值。要获取插值结果,请参阅 percentileCont

语法:percentileDisc(expression, percentile)

返回值:

agtype 浮点数。

参数:

名称 描述
expression agtype 数值表达式
percentile 0.0 到 1.0 之间的 agtype 数值

注意事项:

  • 任何 null 值都会从计算中排除。
  • percentileDisc(null, percentile) 返回 null。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN percentileDisc(n.age, 0.5)
$$) as (percentile_disc_age agtype);

返回属性 age 中值的第 50 百分位数。

结果:

percentile_disc_age
33.0
返回 1 行

count

count() 返回值或记录的数量,有两种变体:

  • count(*) 返回匹配记录的数量
  • count(expr) 返回表达式返回的非 null 值的数量。

语法:count(expression)

返回值:

agtype 整数。

参数:

名称 描述
expression 一个表达式

注意事项:

  • count(*) 包含返回 null 的记录。
  • count(expr) 忽略 null 值。
  • count(null) 返回 0(零)。
  • count(*) 可用于返回节点数量;例如,与某个节点 n 连接的节点数量。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'A'})-[]->(x)
    RETURN n.age, count(*)
$$) as (age agtype, number_of_people agtype);

返回起始节点 n(name 值为 'A')的 age 属性以及与 n 相关的节点数量。

结果:

age number_of_people
13 3
返回 1 行

使用 count(*) 可以对关系类型进行分组和计数,返回每种类型的关系数量。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'A'})-[r]->()
    RETURN type(r), count(*)
$$) as (label agtype, count agtype);

返回关系类型及该类型的关系数量。

结果:

label count
"KNOWS" 3
返回 1 行

使用 count(expression) 返回值的数量

与简单地使用 count(*) 返回记录数量相比,返回表达式返回的实际值数量可能更有用。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'A'})-[]->(x)
    RETURN count(x)
$$) as (count agtype);

返回与起始节点 n 连接的节点数量。

结果:

count
3
返回 1 行

计算非 null 值

count(expression) 可用于返回表达式返回的非 null 值的数量。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN count(n.age)
$$) as (count agtype);

返回标签为 Person 且 age 属性为非 null 值的节点数量。

结果:

count
3
返回 1 行

带去重和不带去重的计数

在此示例中,我们尝试查找所有朋友的朋友并计数:

  • 第一个聚合函数 count(DISTINCT friend_of_friend) 只会计算每个 friend_of_friend 一次,因为 DISTINCT 会去除重复项。
  • 第二个聚合函数 count(friend_of_friend) 会多次计算相同的 friend_of_friend

查询

SELECT *
FROM cypher('graph_name', $$
        MATCH (me:Person)-[]->(friend:Person)-[]->(friend_of_friend:Person)
        WHERE me.name = 'A'
        RETURN count(DISTINCT friend_of_friend), count(friend_of_friend)
$$) as (friend_of_friends_distinct agtype, friend_of_friends agtype);

B 和 C 都认识 D,因此不使用 DISTINCT 时 D 会被计算两次。

结果:

friend_of_friends_distinct friend_of_friends
1 2
1 row

avg

avg() 返回一组数值的平均值。

语法:avg(expression)

返回值:

agtype 整数。

参数:

名称 描述
expression 返回一组数值的表达式。

注意事项:

  • 任何 null 值都会从计算中排除。
  • avg(null) 返回 null。

查询

SELECT *
FROM cypher('graph_name', $$
MATCH (n:Person)
RETURN avg(n.age)
$$) as (avg_age agtype);

返回属性 age 中所有值的平均值。

结果:

avg_age
30.0
返回 1 行

sum

sum() 返回一组数值的总和。

语法:sum(expression)

返回值:

agtype 浮点数。

参数:

名称 描述
expression 返回一组数值的表达式。

注意事项:

  • 任何 null 值都会从计算中排除。
  • sum(null) 返回 null。

查询

SELECT *
FROM cypher('graph_name', $$
MATCH (n:Person)
RETURN sum(n.age)
$$) as (total_age agtype);

返回属性 age 中所有值的总和。

结果:

total_age
90
返回 1 行