当我执行此查询时,使用Neo4J moovie图:
match (p:Person)-[ai:ACTED_IN]->(m:Movie)
where not (p.name in ['Keanu Reeves'])
return m limit 1
我正在拍摄基努·里维斯(Keanu Reeves)在“黑客帝国革命”(The Matrix Revolutions)中扮演的电影。 我认为查询应该返回Keanu Reeves没有采取行动的电影。 我究竟做错了什么?在基努没有采取行动的情况下获取电影的正确方法是什么?
答案 0 :(得分:2)
Patrick Bösch answer有效,但它在(p:Person)
和(m:Movie)
个节点之间构建cartesian product。
以下查询将执行相同的工作,但避免使用笛卡尔产品(我认为更清晰):
MATCH (m:Movie)
WHERE NOT (m)<-[:ACTED_IN]-(:Person {name : 'Keanu Reeves'})
RETURN m
查询将MATCH
所有电影都避免使用:ACTED_IN
与:Person
节点名称等于基努·里维斯的关系。
<强>更新强>
来自评论:
如果不仅仅是基努·里维斯,而是基努·里维斯和罗宾 威廉姆斯?
然后你可以这样做:
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person)
WITH m, collect(p) as actors
WHERE NONE (actor in actors WHERE actor.name IN ['Keanu Reeves', 'Robin Williams'])
RETURN m
或者:
MATCH (m:Movie)
WHERE NONE(n in ['Keanu Reeves', 'Robin Williams']
WHERE (m)<-[:ACTED_IN]-(:Person {name:n}))
RETURN m
答案 1 :(得分:1)
如果你想获得基努·里维斯没有表演过的所有电影,你必须将这种关系排除在结果之外,否则你将获得基努·里维斯和任何其他演员的电影。
获取基努·里维斯没有采取行动的所有电影:
MATCH (p:Person),(m:Movie)
WHERE p.name IN ['Keanu Reeves']
AND NOT ((p)-[:ACTED_IN]->(m))
RETURN m