首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4J:子句不能按预期工作

Neo4J:子句不能按预期工作
EN

Stack Overflow用户
提问于 2017-10-23 08:23:54
回答 2查看 122关注 0票数 1

当我执行此查询时,使用Neo4J moovie图:

代码语言:javascript
复制
match (p:Person)-[ai:ACTED_IN]->(m:Movie)
where not (p.name in ['Keanu Reeves'])
return m limit 1

我正在拍摄基努·里夫斯在“矩阵革命”中扮演的角色。我认为查询应该返回基努·里维斯没有参与的电影。我做错了什么?基努不演戏的电影是怎样拍的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-23 11:05:04

Patrick B sch回答可以工作,但它正在(p:Person)(m:Movie)节点之间构建一个笛卡尔积

下面的查询将完成相同的工作,但避免笛卡尔产品(我认为以更明确的方式):

代码语言:javascript
复制
MATCH (m:Movie)
WHERE NOT (m)<-[:ACTED_IN]-(:Person {name : 'Keanu Reeves'})
RETURN m

查询将MATCH所有电影,避免与名称等于Keanu的:Person节点具有关系:ACTED_IN的电影。

更新

来自评论:

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

然后你就可以:

代码语言:javascript
复制
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

或者:

代码语言:javascript
复制
MATCH (m:Movie)
WHERE NONE(n in ['Keanu Reeves', 'Robin Williams']
    WHERE (m)<-[:ACTED_IN]-(:Person {name:n}))
RETURN m
票数 2
EN

Stack Overflow用户

发布于 2017-10-23 09:30:53

如果你想得到基努·里夫斯不演的所有电影,你必须把这种关系排除在结果之外,否则你会得到基努·里维斯和其他演员也参与的电影。

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

代码语言:javascript
复制
MATCH (p:Person),(m:Movie)
WHERE p.name IN ['Keanu Reeves']
AND NOT ((p)-[:ACTED_IN]->(m))
RETURN m
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46884851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档