本文介绍能够进行自动聚合的函数。
数据准备
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 | 包含任意组合的属性类型和列表的集合的表达式。 |
注意事项
任何空值都将从计算中排除。
在混合集中,任何字符串值总是被认为小于任何数值,任何列表总是被认为小于任何字符串。
列表按字典顺序比较,即从列表开始到结束,列表元素逐对按升序比较。
min(null)返回null。
示例
SELECT *
FROM cypher('graph_name', $$
MATCH (v:Person)
RETURN min(v.age)
$$) as (min_age agtype);返回属性age中所有值的最小值。
min_age
---------
13
(1 row)使用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);使用
min()与列表。SELECT * FROM cypher('graph_name', $$ MATCH (v:min_test) RETURN min(v.val) $$) as (min_val agtype);返回集合中所有值的最小值。在这种情况下,是列表
['a', 'b', 23'],因为['a', 'b', 23]和[1, 'b', 23]两个列表被视为比字符串d更小的值,且['a', 'b', 23]中的字符串a被视为比数值1更小的值。min_val ---------------- ["a", "b", 23] (1 row)
max
max()返回一组值中的最大值。
语法
max(expression)返回值
根据表达式返回的值,可以是一个属性类型或一个列表。
参数
名称 | 描述 |
expression | 包含任意组合的属性类型和列表的集合的表达式。 |
注意事项
任何空值都将从计算中排除。
在混合集中,任何字符串值总是被认为小于任何数值,任何列表总是被认为小于任何字符串。
列表按字典顺序比较,即从列表开始到结束,列表元素逐对按升序比较。
max(null)返回null。
示例
SELECT *
FROM cypher('graph_name', $$
MATCH (n:Person)
RETURN max(n.age)
$$) as (max_age agtype);返回属性age中所有值的最大值。
max_age
---------
44
(1 row)stDev
stDev()返回给定值在组内的标准差。它使用标准的两遍方法,分母为N - 1,并应在从总体中抽取样本进行无偏估计时使用。当计算整个总体的标准差时,应使用stDevP。
语法
stDev(expression)返回值
Agtype浮点数。
参数
名称 | 描述 |
expression | Agtype数字表达式。 |
注意事项
任何空值都会被排除在计算之外。
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 row)stDevP
stDevP()返回给定值在一组数据中的标准差。它使用标准的两步法,分母为N,当计算整个总体的标准差时应使用此函数。如果只是计算总体样本的标准差,则应使用stDev。
语法
stDevP(expression)返回值
Agtype浮点数。
参数
名称 | 描述 |
expression | Agtype数字表达式。 |
注意事项
任何空值都会从计算中排除。
stDevP(null)返回0.0(零)。
示例
SELECT *
FROM cypher('graph_name', $$
MATCH (n:Person)
RETURN max(n.age)
$$) as (max_age agtype);返回属性age值的总体标准差。
stdevp_age
--------------------
12.832251036613439
(1 row)percentileCont
percentileCont()返回给定值在一组数据中的百分位数,百分位数范围从0.0到1.0。它使用线性插值方法,如果所需的百分位数位于两个值之间,则计算这两个值之间的加权平均值。对于使用四舍五入方法的最近值,请参见percentileDisc。
语法
percentileCont(expression, percentile)返回值
Agtype浮点数。
参数
名称 | 描述 |
expression | Agtype数字表达式。 |
percentile | 百分位数,一个介于0.0和1.0之间的Agtype数字值。 |
注意事项
任何空值都将从计算中排除。
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个百分位数,该值通过加权平均计算得出。在这种情况下,0.4是中位数,即第40个百分位数。
percentile_cont_age
---------------------
29.0
(1 row)percentileDisc
percentileDisc()函数返回给定值在一组数据中的百分位数,百分位数范围从0.0到1.0。它使用四舍五入的方法来计算最接近该百分位数的值。对于插值的情况,请参见percentileCont。
语法
percentileDisc(expression, percentile)返回值
Agtype浮点数。
参数
名称 | 描述 |
expression | Agtype数字表达式。 |
percentile | 百分位数,一个介于0.0和1.0之间的Agtype数字值。 |
注意事项
任何空值都将从计算中排除。
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 row)count
count()返回值或记录的数量,它有两种变体:
count(*)返回匹配记录的数量。count(expr)返回表达式返回的非空值的数量。
语法
count(expression)返回值
Agtype整数。
参数
名称 | 描述 |
expression | Agtype表达式。 |
注意事项
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(其名称值为
A)的年龄属性以及与n相关的节点数量。age | number_of_people -----+------------------ 13 | 3 (1 row)使用
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 row)
使用count(expression)返回值的数量
与其简单地使用count(*)返回记录的数量,返回表达式实际返回的值的数量可能更有用。
示例
SELECT *
FROM cypher('graph_name', $$
MATCH (n {name: 'A'})-[]->(x)
RETURN count(x)
$$) as (count agtype);返回与起始节点n连接的节点数量。
count
-------
3
(1 row)计算非空值
count(expression)可用于返回表达式返回的非空值的数量。
示例
SELECT *
FROM cypher('graph_name', $$
MATCH (n:Person)
RETURN count(n.age)
$$) as (count agtype);返回具有Person标签且年龄属性为非空值的节点数量。
count
-------
3
(1 row)包含和不包含重复项的计数
示例
在以下示例中,我们试图找到所有我们的“朋友的朋友”,并统计他们的数量。
第一个聚合函数
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 row)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 row)