【问题标题】:Neo4J averaging numeric property over several nodesNeo4J 在多个节点上平均数值属性
【发布时间】:2018-04-08 18:17:46
【问题描述】:

我有一个大图表和正好 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)

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

【问题讨论】:

    标签: graph neo4j nosql


    【解决方案1】:

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

    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 发送。请参阅戴夫回答下的评论。您能否通过强调继续进行子查询而不是诉诸(有时)必要的 UNWIND 诅咒的优势来扩展 yrs ?我来自图表(不是来自数据库),我没有找到任何结构良好的解释来说明它们的相对优缺点。或者这是否需要我提出另一个问题?干杯。
    • @Cbhihe 我认为在您的情况下,我的决定在查询的可读性和清晰度方面的优势。并且很可能性能不会有特别大的不同。
    【解决方案2】:

    当您将节点与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;
    

    【讨论】:

    • +1:谢谢戴夫。我在我的真实配方中使用标签。我简化了 pbm 语句,因此帖子会更清晰。 Yr 解决方案有效,但使用了 collect() 和 UNWIND。至少就 UNWIND 而言,我(毫无疑问)理解它通常是昂贵的。出于这个原因,我选择了@stdob-- 的答案,除了不诉诸 UNWIND 之外,还有另一个优点是呈现更简单的子查询结构。我想从数据库拓扑的角度来看,没有明显更好的解决方案。这完全取决于图表的性质。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多