【问题标题】:Filter nodes based on two aggregate functions applied to two subset of children nodes基于应用于两个子节点子集的两个聚合函数过滤节点
【发布时间】:2017-08-10 19:08:22
【问题描述】:

这是 (Neo4j: Filter nodes based on aggregate function) 的扩展

假设我有一组客户节点和一组与这些节点关联的每个客户下的订单。每个订单节点都有两个与之关联的属性:成本和下订单的商店。我想提取那些在商店 A 的平均订单超过 300 但同时他在商店 B 的平均订单低于 100 的客户。这是我的(不起作用的)尝试这样做:

MATCH (n0:Customer)-[]->(n1:Order {store: 'storeA'})
WITH n0, avg(n1.cost) as average_storeA WHERE average_storeA > 300
WITH (n0:Customer)-[]->(n2:Order {store: 'storeB'})
WITH n0, avg(n2.cost) as average_storeB where average_storeB < 100
return n0

问题是在第 3 行中 WITH 语句返回一个错误,它不知道 n2 的含义。如何将先前匹配语句的结果通过管道传输到引入新节点查询/变量的新匹配语句?我想你可以尝试两个独立的匹配查询,然后找到节点集之间的交集,但这应该比在已经过滤的节点集之上应用第二个过滤器要慢得多。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您应该使用之前的 n0 变量来 MATCH 新模式,而不是第 3 行中的 WITH,如下所示:

    MATCH (n0:Customer)-[]->(n1:Order {store: 'storeA'})
    WITH n0, avg(n1.cost) as average_storeA WHERE average_storeA > 300
    MATCH (n0)-[]->(n2:Order {store: 'storeB'})
    WITH n0, avg(n2.cost) as average_storeB where average_storeB < 100
    return n0
    

    【讨论】:

    • 谢谢。出于某种原因,我认为引入 match 会创建一个新的 n0 变量,与第一行的变量分开。我想我只是不清楚何时使用 MATCH 与 WITH 来传递聚合函数以外的结果。
    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多