Neo4j Cypher中能否在CASE语句中使用模式判断关系是否存在?
解决单向好友关系的反向存在性判断问题
你遇到的问题是因为Cypher的CASE语句不能直接用关系模式来判断“是否存在”,得用专门的EXISTS()函数来检查模式的存在性。我给你两个可行的纯Cypher解决方案:
方案一:用CASE语句明确返回true/false
这是最贴合你原本需求的写法,用EXISTS()包裹反向关系的模式,在CASE里做逻辑判断:
MATCH (asker)-[:friend]->(target) RETURN asker, target, CASE WHEN EXISTS((target)-[:friend]->(asker)) THEN true ELSE false END AS returnsFriendship
方案二:直接返回EXISTS的结果(更简洁)
因为EXISTS()本身就会返回布尔值(true/false),所以可以省去CASE语句,直接返回检测结果:
MATCH (asker)-[:friend]->(target) RETURN asker, target, EXISTS((target)-[:friend]->(asker)) AS returnsFriendship
为什么你的原语句无效?
你原来的写法CASE (target)-[:friend]->(asker) WHEN present THEN true不符合Cypher的语法规则:Cypher的CASE要么是基于表达式的判断,要么是简单值匹配,但不能直接把关系模式放在CASE后面来判断是否存在。必须用EXISTS()函数来检测模式的存在性,它会遍历图中是否有符合该模式的路径,返回对应的布尔值。
内容的提问来源于stack exchange,提问作者Mohelgamal
相关产品推荐
相关产品推荐

