如何编写Cypher查询获取《Cloud Atlas》两跳范围内的演员与电影
Cypher 查询问题排查与修正方案
原有查询的错误点梳理
- 第一个查询问题:
- 节点变量名不能包含空格,
(Cloud Atlas {name:"Cloud Atlas"})属于语法错误 - 未指定电影节点标签
:Movie,匹配时会遍历所有类型节点,性能极低 - 电影节点的标识属性通常为
title而非name,属性匹配错误 - 返回的节点未做类型区分,所以无法分离演员和对应的电影信息
- 节点变量名不能包含空格,
- 第二个查询报错核心原因:
- MATCH 子句语法错误,不能用逗号分隔两个节点后直接关联关系,Cypher 无法识别这种非链式的路径匹配规则
- 未明确路径的结构逻辑,2跳路径从《云图》出发的标准结构是
云图电影 <- 参演关系 - 演员 - 参演关系 -> 其他电影
可直接运行的正确查询
要获取所有和《云图》演员共同出演过的其他电影,以及对应的演员名称,使用以下语句即可:
MATCH (:Movie {title: "Cloud Atlas"})<-[:ACTED_IN]-(people:Person)-[:ACTED_IN]->(m:Movie) RETURN DISTINCT people.name AS 演员名称, m.title AS 关联电影名称
如果确实需要使用可变长度路径的写法(兼容更复杂的多跳场景),可以用以下调整后的版本:
MATCH p = (:Movie {title: "Cloud Atlas"})-[*2]-(m:Movie) WHERE ALL(r IN relationships(p) WHERE type(r) = 'ACTED_IN') RETURN DISTINCT nodes(p)[1].name AS 演员名称, m.title AS 关联电影名称
补充说明
如果你的图数据库里参演关系的类型不是ACTED_IN,替换成你实际使用的关系类型即可正常返回结果。
内容的提问来源于stack exchange,提问作者Alaina Sand
相关产品推荐
相关产品推荐

