在Neo4j电影样本数据集中,如何查询未与Gene Hackman合作却曾被其参演电影导演执导的演员
如何用Cypher查询特定演员关联导演的非合作演员
你已经能查询Gene Hackman参演电影的导演了,现在要找那些被这些导演执导过,但从没和Gene同框过的演员,我们可以一步步拆解需求来写Cypher:
核心思路拆解
- 第一步:锁定Gene Hackman本人,以及他参演过的所有电影对应的导演
- 第二步:找到这些导演执导过的所有电影(不管Gene有没有参演)
- 第三步:提取这些电影里的所有演员,然后排除掉那些曾经和Gene在同一部电影里合作过的演员
- 第四步:去重,避免同一个演员出现在多个结果里
最终Cypher语句
MATCH (gene:Person {name: "Gene Hackman"})-[:ACTED_IN]->()<-[:DIRECTED]-(director:Person) MATCH (director)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(actor:Person) WHERE actor <> gene AND NOT EXISTS((actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(gene)) RETURN DISTINCT actor.name AS actor_name, actor.born AS actor_born ORDER BY actor_name
语句细节解释
- 第一行MATCH:先定位Gene,再找到他参演电影的所有导演,这部分和你之前的查询逻辑一致
- 第二行MATCH:从这些导演出发,找到他们执导的所有电影,再提取这些电影的所有演员
- WHERE条件:
actor <> gene:排除Gene本人(避免把他自己误算进结果)NOT EXISTS((actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(gene)):核心过滤条件,确保这个演员从未和Gene在同一部电影里有过合作记录
- RETURN部分:用
DISTINCT去重,返回演员的姓名和出生年份,最后按姓名排序让结果更规整
测试验证
在Neo4j的Movies数据集里运行这个语句,你会得到比如Clint Eastwood执导的其他非Gene参演电影里的演员,或者Mike Nichols执导作品里未和Gene合作过的演员,完全符合你的需求。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

