【问题标题】:Neo4J: clause NOT not working as expectedNeo4J:子句没有按预期工作
【发布时间】:2017-10-23 08:23:54
【问题描述】:

使用 Neo4J 电影图,当我执行这个查询时:

match (p:Person)-[ai:ACTED_IN]->(m:Movie)
where not (p.name in ['Keanu Reeves'])
return m limit 1

我正在拍摄基努·里维斯(Keanu Reeves)出演的电影,例如“黑客帝国革命”。 我假设查询应该返回基努·里维斯没有表演的电影。 我究竟做错了什么?获取基努没有演过的电影的正确方法是什么?

【问题讨论】:

  • 多人在一部电影中表演(...一般来说),而您正在计算电影中的演员。您想计算电影,筛选出没有个演员是基努·里维斯的电影。

标签: neo4j cypher


【解决方案1】:

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 与名称等于 Keanu Reeves 的 :Person 节点有关系的电影。

更新

来自 cmets:

如果不仅仅是基努·里维斯,还有基努·里维斯和罗宾呢? 威廉姆斯?

那么你可以这样做:

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

【讨论】:

  • 如果不仅是基努·里维斯,还有基努·里维斯和罗宾·威廉姆斯怎么办?
  • @Dexter 您需要先 MATCH 这些节点,例如:MATCH (p:Person) WHERE p.name IN ['Keanu Reeves', 'Robin Williams'] MATCH (m:Movie) WHERE NOT (m)&lt;-[:ACTED_IN]-(p) RETURN DISTINCT m
  • @Dexter 另外,我在m 之前添加了DISTINCT 以避免重复结果。
  • @Dexter 哦,对了!我现在知道了。试试看:MATCH (m:Movie)&lt;-[: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
  • @Dexter 或者这个(避免WITH):MATCH (m:Movie) WHERE NONE(n in ['Keanu Reeves', 'Robin Williams'] WHERE (m)&lt;-[:ACTED_IN]-(:Person {name:n})) RETURN m
【解决方案2】:

如果您想获得所有基努·里维斯没有出演的电影,则必须从结果中排除这种关系,否则您将获得基努·里维斯和任何其他演员也出演过的电影。

获取所有基努·里维斯没有出演过的电影:

MATCH (p:Person),(m:Movie)
WHERE p.name IN ['Keanu Reeves']
AND NOT ((p)-[:ACTED_IN]->(m))
RETURN m

【讨论】:

  • 另外,p.name IN ['Keanu Reeves'] 太过分了。只需使用p.name = 'Keanu Reeves',或者,为了更清楚,MATCH (p:Person{name: 'Keanu Reeves'}), (m:Movie)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多