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

时间:2014-10-15 21:56:06

标签: neo4j cypher

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

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

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

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

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

提前感谢您的时间。

2 个答案:

答案 0 :(得分:2)

以下方法将用户最喜爱的意大利辣香肠的数量与所有意大利辣香肠比萨的数量进行比较。它运行良好,因为它匹配使用索引和关系遍历来只收集有意大利辣香肠的用户收藏。 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

答案 1 :(得分:1)

这是如何找到所有喜欢任何披萨配辣椒酱的不同用户:

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;