2015-03-18 153 views
1

我正在使用附带Neo4j安装的示例电影图。在Neo4j中匹配有和没有关系的节点

我想得到一个演员(名字),他在电影和所有其他电影(他还没有连接到)中扮演的角色。

我能得到的最接近的是类似于以下内容的内容,但演员,角色和已执行影片的重复次数与其他影片重复次数一样多。

MATCH (actor{name:'Bill Paxton'})-[roles:ACTED_IN]->(actedInMovies), (otherMovies:Movie) 
WHERE NOT (actor)-[:ACTED_IN]->(otherMovies) 
RETURN actor, roles, actedInMovies, otherMovies 

我该如何为演员,相应电影的角色以及所有其他电影只获取一个结果?

在此先感谢!

回答

1

稍微不同的方法怎么样首先得到比尔帕克斯顿演过的所有电影,然后用该电影集合找到所有不在其中的电影。然后回到比尔·帕克斯顿,他演过电影的收集和电影,他并没有采取行动的集合(即剩余)

MATCH (actor:Person {name:'Bill Paxton'})-[r:ACTED_IN]->(acted:Movie) 
with actor, collect(acted) as acted_in_movies, collect(r) as roles 
MATCH (other:Movie) 
WHERE none (acted in acted_in_movies where acted = other) 
RETURN actor.name, acted_in_movies, roles, collect(other) as other_movies 

更新查询,以反映我测试了它的数据集。添加角色名称的集合并将电影节点更改为结果集的标题。

MATCH (actor {name:'Bill Paxton'})-[r:ACTS_IN]->(acted) 
with actor, collect(acted) as acted_in_movies, collect(acted.title) as acted_titles, collect(r.name) as roles 
MATCH (other:Movie) 
WHERE none (acted in acted_in_movies where acted = other) 
RETURN actor.name, acted_titles, roles, collect(other.title) as other_movies 
+0

我得到0行与该查询? – 2015-03-19 19:16:16

+0

不是,它确实是ACTED_IN – 2015-03-19 19:38:17

+0

嗯,0行还有 – 2015-03-19 23:40:55

相关问题