Neo4J:条款没有按预期工作

时间:2017-10-23 08:23:55

标签: neo4j cypher

当我执行此查询时,使用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没有采取行动的电影。 我究竟做错了什么?在基努没有采取行动的情况下获取电影的正确方法是什么?

2 个答案:

答案 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