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

时间:2018-01-23 18:57:32

标签: neo4j cypher filtering processing-efficiency cypher-3.1

我正在尝试使用代表(: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节点上重做过滤过程。

1 个答案:

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