Neo4J在几个节点上平均数字属性

时间:2018-04-08 18:17:47

标签: graph neo4j nosql

我有一张大图和正好2天的Neo4J,即zilch。

我想计算某些数字属性的所有节点的平均值,比如节点n.prop_01中出现的(n)。然后我想得到属性n.prop_01低于特定阈值的节点,具体取决于平均值。

我在文档或在线论坛上找不到答案或鼓舞人心的事情。我尝试了以下内容以及更多...

MATCH (n) WHERE exists(n.prop_01)
WITH n, collect(n.prop_01) AS all_prop_01
UNWIND all_prop_01 as all_prop
WITH n,prop_01,avg(all_prop) AS avg_prop
WHERE n.prop_01 < (1.1*avg_prop)
RETURN n.name,n.prop_01  LIMIT 20;

结果:(no changes, no records)

感谢关于为什么这不起作用以及如何使其工作的任何指示。

2 个答案:

答案 0 :(得分:2)

您需要首先计算平均值,然后进行过滤,否则当您展开时,平均值等于每个节点的属性:

MATCH (n) WHERE exists(n.prop_01)
WITH avg(n.prop_01) as avg_prop
MATCH (n) WHERE exists(n.prop_01) AND n.prop_01 < 1.1 * avg_prop
RETURN count(n), avg_prop

答案 1 :(得分:1)

您可以在将节点与prop_01匹配时计算上游的平均值。

您还应该考虑在匹配项中添加标签,以减少查询需要查看的节点数。

您还可以收集n个节点,而不仅仅是prop_01,并在稍后的展开时使用它。

MATCH (n:Add_A_Node_Label_Here)
WHERE exists(n.prop_01)
WITH collect(n) AS all_n, avg(n.prop_01) as avg_prop
UNWIND all_n as n
WITH n, avg_prop
WHERE n.prop_01 < (1.1 * avg_prop)
RETURN n.name, n.prop_01  
LIMIT 20;