group by语句使用聚合函数时如何进行过滤?

举例如下

GO FROM 100 OVER someEdge BIDIRECT
YIELD
someEdge._src as src,
$$.someTag.a as a,
$$.someTag.b as b
|GROUP BY $-.src
YIELD
COUNT($-.a) as a,
COUNT($-.b) as b

使用类似 count、sum、min、max等聚合函数时,如何排除无效值?(因为nebula没有null,所以所有属性都填了默认值,比如当遇到空值时,填了-99,此时使用min函数就会导致结果错误)

不能使用where条件,因为会涉及到多个属性,如果根据某个属性过滤,最终找到的邻居数量不对

GROUP BY是用于pipe后面,它是对结果分组计算,过滤条件是作用于前面的数据,也就是在你这个语句的GO 语句。

不能使用where条件,因为会涉及到多个属性,如果根据某个属性过滤,最终找到的邻居数量不对

没明白你的意思,可以举例子说明吗?

比如someTage有a和b两个属性
然后有以下数据

id    a        b
1    -99      -99
2     1       -99
3     1        3
4     2        3

比如groupby之后,要求a和b的均值,-99应该不参与计算

GO FROM 100 OVER someEdge BIDIRECT
where 
$$.someTag.a!=-99
and
$$.someTag.b!=-99
YIELD
someEdge._src as src,
$$.someTag.a as a,
$$.someTag.b as b
|GROUP BY $-.src
YIELD
avg($-.a) as a,
avg($-.b) as b

按上述where过滤完了,点只剩 3和4了
算a的平均值的时候 应该是 id 2、3、4参与计算
算b的平均值的时候 应该是id 3、4参与计算

你这个是null type的支持,而不是通过过滤。2.0已经支持null,你可以在2.0上面试用,看是否满足你的需求。

1 个赞

好吧 但是2.0还要等好久…
那我这边直接把全部属性抽回应用层代码去进行判断处理聚合,您觉得这样使用可行吗?会非常影响效率吗?

看返回的数据量,肯定是会影响的,数据量越大,影响越大。

嗯嗯 明白您的意思~
不过这个应用层处理 本质上 和graph层 道理上应该是一样的吧?
graph不也是把所有的数从各个storage上聚合到一起嘛?(当然graph层的优化肯定是要比随便写的应用层强很多)

除此之外您还有什么好的建议嘛?

不过这个应用层处理 本质上 和graph层 道理上应该是一样的吧?

graphd 是同时向多个storaged获取所有数据的,然后在graphd经过聚合运算之后到客户端那,到达客户端的结果数据量就少了很多。假如放到客户端做,主要是大数据量从graphd给client的时候在网络传输耗时加大。对于计算,客户端和服务端对同样的数据做计算是差不了多少。

3 个赞

明白了~ 谢谢您~