我正在尝试使用代表(:Shopper)
的人-[:Make]->(:Purchase)
以及每次购买-[:Contains]->(:Item)
的图表。挑战在于我想比较购物者在最近购买时购买的商品A的数量。仅使用一个消除项目:包含关系将无效,因为该项目可能也是在之前的购买中购买的。
我可以使用
获取所有购物者最近购买的所有商品的数据MATCH (s:Shopper)-->(p:Purchase)
WITH s, max(p.Time) AS latest
MATCH (s)-->(p:Purchase)
WHERE p.Time = latest
MATCH (p)-[c:Contains]->(i:Item)
RETURN s.Name, p.Time, c.Quantity, i.Name
但现在我想用
之类的东西替换第二个MATCH子句MATCH (p:Purchase)-[c1:Contains]->(i:Item)<-[c2:Contains]-(p:Purchase)
并且它不会返回任何结果。我怀疑这会查找包含两个项目的项目:包含与SAME Purchase的关系。我想得到:包含同一过滤组中两个不同购买的关系。我怎样才能有效地做到这一点?我真的想避免在第二个Purchase节点上重做过滤过程。
答案 0 :(得分:0)
[增订]
在您的热门查询中,您无需MATCH
两次即可获得每个Purchase
的最新Shopper
(见下文)。
在MATCH
代码段中,您对p
个节点使用相同的Purchase
变量,因此当然它们必须是同一个节点。
以下是一个查询,该查询应返回多个Item
s的最新Purchase
中的每个Shopper
的一组数据:
MATCH (s:Shopper)-[:Make]->(pur:Purchase)
WITH s, pur
ORDER BY pur.Time DESC
WITH s, HEAD(COLLECT(pur)) AS p
MATCH (p)-[c:Contains]->(i:Item)
WITH i, COLLECT({shopper: s.Name, time: p.Time, quantity: c.Quantity}) AS set
WHERE SIZE(set) > 1
RETURN i.Name AS item, set;
Here is a console使用您的示例数据演示查询(对标签和类型名称进行更正)。它产生了这个结果:
+-------------------------------------------------------------------------------------------------------------------------------+
| item | set |
+-------------------------------------------------------------------------------------------------------------------------------+
| "Banana" | [{shopper=Mandy, time=213, quantity=12},{shopper=Joe, time=431, quantity=5},{shopper=Steve, time=320, quantity=1}] |
+-------------------------------------------------------------------------------------------------------------------------------+