Cypher匹配与符合某些条件的所有节点都有关系的节点



假设我有一个披萨菜单,其中每种类型的披萨都表示为标签为Pizza的节点,每个浇头都是标签为Topping的节点。为了获得所有的意大利辣香肠披萨,我写了以下查询

MATCH (p:Pizza)-[:HAS]->(t:Topping{type : "pepperoni"}) return p.  

然后说我有一组用户可以指定他们最喜欢的披萨。

MATCH (u:User)-[:HAS_FAVORITE]->(p:Pizza).  

找到喜欢所有带意大利辣香肠的披萨的用户的最佳方法是什么?

提前感谢您抽出时间。

下面的方法将用户最喜欢的意大利辣香肠的计数与所有意大利辣香肠披萨的计数进行比较。它的性能很好,因为它使用索引和关系遍历来匹配,只收集有辣香肠的用户收藏夹。cybersam发布的答案很慢,因为它必须对所有收藏夹进行全面扫描。

MATCH (p:Pizza)-[:HAS]->(t:Topping { type : "pepperoni" })
WITH COUNT(p) AS pCnt, COLLECT(p) AS pCol
UNWIND pCol as pPep
MATCH (u:User)-[:HAS_FAVORITE]->(pPep)
WITH u, COUNT(*) as fCnt, pCnt
WHERE fCnt = pCnt
RETURN u

这是如何找到所有喜欢意大利辣香肠披萨的不同用户的方法:

MATCH (u:User)-[:HAS_FAVORITE]->(p:Pizza)-[:HAS]->(t:Topping {type : "pepperoni"})
RETURN DISTINCT u;

这是一种找到所有喜欢意大利辣香肠披萨的不同用户的方法:

MATCH (p:Pizza)-[:HAS]->(t:Topping { type : "pepperoni" })
WITH COLLECT(p) AS ps
MATCH (u:User)-[:HAS_FAVORITE]->(q:Pizza)
WITH u, COLLECT(q) AS qs, ps
WHERE ALL (x IN ps WHERE x IN qs)
RETURN u;

最新更新