Cypher查询一个节点是否连接到过滤组中的多个节点

Cypher query whether a node is connected to multiple nodes in a filtered group

我正在试验一个代表 (:Shopper) 的人 -[:Make]->(:Purchase)-[:Contains]->(:Item) 的每次购买的图表。挑战在于我想比较每个购物者在最近一次购买时购买的商品 A 的数量。消除只有一个 :Contains 关系的项目将不起作用,因为该项目也可能是在较早的购买中购买的。

我可以通过

获取所有购物者最近购买的所有商品集合的数据
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)

它没有 return 任何结果。我怀疑这会查找具有两个 :Contains 与 SAME Purchase 的关系的项目。我想获得:包含同一过滤组中两个不同购买的关系。我怎样才能有效地做到这一点?我真的很想避免在第二个 Purchase 节点上重做过滤过程。

[更新]

在您的热门查询中,您不需要 MATCH 两次以获得每个 Shopper 的最新 Purchase(见下文)。

在您的 MATCH 片段中,您对两个 Purchase 节点使用了相同的 p 变量,因此它们当然被强制为同一节点。

这是一个查询,它应该 return 每个 Item 的一组数据,这些数据位于多个 Shopper 的最新 Purchase 中:

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}] |
+-------------------------------------------------------------------------------------------------------------------------------+