Cypher:OR连接的路径节点属性的多个路径和条件

时间:2019-01-29 12:24:44

标签: neo4j cypher

需要以下密码的帮助,

MATCH (user)
WHERE (ID(user) = 999)
MATCH (user)<-[rel1:`post`]-(p:`Post`)
WHERE ((p)-[r:`review`]->(w:Review) AND r.score IN [4,5] AND w.category='FB') OR
((p)-[r:`review`]->(w:Review) AND r.score IN [6,8] AND w.category='INSTA')
RETURN DISTINCT(p)

这会导致undefined variable r错误。

2 个答案:

答案 0 :(得分:2)

如果这里只有一种关系类型,拉杰的方法是正确的。

但是,您说的是“或之后的关系可能会有所不同”,因此您要查找的是满足特定谓词的一种关系类型,还是查找具有不同谓词的另一种关系类型。

您可以在此处使用pattern comprehensions来收集模式匹配项,这将使您在理解范围内引入新的变量。

MATCH (user)
WHERE ID(user) = 999
MATCH (user)<-[:`post`]-(p:`Post`)
WITH user, p, [(p)-[r:`review`]->(w:Review) WHERE r.score IN [4,5] AND w.category='FB' | w] as midFB_Review, [(p)-[r:`review`]->(w:Review) WHERE r.score IN [6,8] AND w.category='INSTA' | w] as highINSTA_Review
WITH user, p
WHERE size(midFB_Review) + size(highINSTA_Review) > 0
RETURN p

请注意,您的关系类型(甚至您匹配的整个模式)在单独的模式理解上可能会有所不同。

答案 1 :(得分:1)

新变量(这里的r和w)在 WHERE 子句中是不允许的。

您只能检查变量是否在位置之前。

通过将关系检查从 WHERE 移至 MATCH 子句,您可以得到相同的结果,

MATCH (user) WHERE (ID(user) = 999) 
MATCH (user)<-[rel1:`post`]-(p:`Post`)-[r:`review`]->(w:Review) 
WHERE (r.score IN [4,5] AND w.category='FB') OR (r.score IN [6,8] AND w.category='INSTA') 
RETURN DISTINCT(p)