0

我正在试验一个代表(: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)

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

4

1 回答 1

0

[更新]

在您的顶级查询中,您不需要MATCH两次来获取Purchase每个查询的最新信息Shopper(见下文)。

在您的MATCH代码段中,您对两个节点使用相同的p变量Purchase,因此它们当然被迫成为同一个节点。

这是一个查询,它应该为多个sItem中的最新s 中的每个返回一组数据:PurchaseShopper

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;

这是一个控制台,它使用您的示例数据演示查询(对标签和类型名称进行更正)。它产生这个结果:

+-------------------------------------------------------------------------------------------------------------------------------+
| item     | set                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------+
| "Banana" | [{shopper=Mandy, time=213, quantity=12},{shopper=Joe, time=431, quantity=5},{shopper=Steve, time=320, quantity=1}] |
+-------------------------------------------------------------------------------------------------------------------------------+
于 2018-01-23T19:56:39.117 回答