Neo4j 基于应用于两个子节点子集的两个聚合函数筛选节点

Neo4j 基于应用于两个子节点子集的两个聚合函数筛选节点,neo4j,cypher,Neo4j,Cypher,这是() 假设我有一组客户节点,每个客户都下了一组与这些节点关联的订单。每个订单节点都有两个与之关联的属性:成本和下单所在的商店。我想提取那些在storeA的平均订单超过300,但同时在StoreB的平均订单低于100的客户。以下是我的(非功能性)尝试: MATCH (n0:Customer)-[]->(n1:Order {store: 'storeA'}) WITH n0, avg(n1.cost) as average_storeA WHERE average_storeA >

这是()

假设我有一组客户节点,每个客户都下了一组与这些节点关联的订单。每个订单节点都有两个与之关联的属性:成本和下单所在的商店。我想提取那些在storeA的平均订单超过300,但同时在StoreB的平均订单低于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
匹配(n0:Customer)-[]->(n1:Order{store:'storeA'})
对于n0,平均成本(n1.成本)为平均存储A,其中平均存储A>300
与(n0:Customer)-[]->(n2:Order{store:'storeB'})
n0时,平均成本(n2.成本)为平均库存B,其中平均库存B<100
返回n0

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

而不是在第3行中使用
匹配
新模式,使用先前的
n0
变量,如下所示:

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
匹配(n0:Customer)-[]->(n1:Order{store:'storeA'})
对于n0,平均成本(n1.成本)为平均存储A,其中平均存储A>300
匹配(n0)-[]->(n2:Order{store:'storeB'})
n0时,平均成本(n2.成本)为平均库存B,其中平均库存B<100
返回n0

谢谢。出于某种原因,我认为引入match会创建一个新的n0变量,与第一行的变量不同。我想我只是不清楚什么时候使用MATCH和when管道结果而不是聚合函数。