过滤节点节点

问题描述:

这是(Neo4j: Filter nodes based on aggregate function过滤节点节点

假设的扩展我有一组客户节点和一组命令的每个客户已放置关联到这些节点中的。每个订单节点都有两个与其关联的属性:成本和订单所在的商店。我想提取的客户,其平均订单在storeA超过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的含义。如何将前一个匹配语句的结果传递给新的匹配语句,其中引入了新的节点查询/变量?我想你可以尝试两个独立的匹配查询,然后找到节点集之间的交集,但这应该比在已经过滤的一组节点上应用第二个过滤器要慢得多。

代替WITH在第3行,你应该使用以前n0变量,这样MATCH的新格局:

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 
+1

谢谢。出于某种原因,我认为引入匹配会创建一个新的n0变量,与第一行中的变量分开。我想我只是不清楚什么时候使用MATCH vs WITH来处理聚合函数以外的结果。 – Proto