如何使用shortestPath()返回连接Bruce Willis与Oliver Stone的电影节点?
解决shortestPath提取中间Movie节点的问题
你的思路方向是对的,但原语句里有个容易踩的小坑——nodes(p)返回的是整条最短路径里的所有节点组成的列表,直接用WHERE type(n) = 'Movie'没办法遍历这个列表里的每个节点做筛选。咱们调整一下语句就能顺利拿到最短路径里的电影节点了:
MATCH p = shortestPath((d:Director{director_name:'Oliver Stone'})-[*]-(a:Actor{actor_name:'Bruce Willis'})) UNWIND nodes(p) AS n WHERE labels(n) CONTAINS 'Movie' RETURN n
给你拆解下关键调整点:
- 用
UNWIND nodes(p) AS n把节点列表“拆”成单个节点,这样就能逐个检查每个节点的标签了 - 这里用
labels(n) CONTAINS 'Movie'比type(n)更贴合Neo4j的使用习惯,因为type()其实是用来检查关系类型的,节点的类型标识一般用标签(比如:Movie),用标签判断会更准确。如果你的数据结构确实用type来标记节点类型,那换成WHERE type(n) = 'Movie'也没问题。
如果想同时保留完整路径和提取出的电影节点集合,可以这么写:
MATCH p = shortestPath((d:Director{director_name:'Oliver Stone'})-[*]-(a:Actor{actor_name:'Bruce Willis'})) WITH p, nodes(p) AS allNodes UNWIND allNodes AS n WHERE labels(n) CONTAINS 'Movie' RETURN p, collect(n) AS moviesInShortestPath
内容的提问来源于stack exchange,提问作者Alex Q
相关产品推荐
相关产品推荐

