我有一个这样的图表:

我想要做的是返回演员,这些演员只在一部指定的电影中扮演。例如,如果我传递一个钢铁侠2 id,它应该只返回Robert Downey。Scarlett Johansson被跳过,因为她已经出演了3部电影,而且她还有一段"IS_FRIEND_WITH“的关系。我写的这段代码,返回在id 11 in this case电影中扮演的所有演员
MATCH (a)
WHERE ID(a) = 11
MATCH (b:Actor)-[:ACTED_IN]-(a:Movie)
RETURN b如果钢铁侠2的Id = 11,它将返回斯嘉丽和罗伯特·唐尼。我只想让它只返回罗伯特·唐尼。
发布于 2021-11-28 18:51:12
您需要应用另一个筛选器,以仅选择具有单个ACTED_IN关系的节点。
MATCH (a:Movie)
WHERE ID(a) = 11
MATCH (b:Actor)-[:ACTED_IN]-(a)
// apply filter for nodes that have only a single ACTED_IN relationship
WITH b, size((b)-[:ACTED_IN]->()) as number_of_movies
WHERE number_of_movies = 1
RETURN b发布于 2021-11-28 21:00:16
我会这么做的
WITH 11 AS movieId
MATCH (a:Actor)
WHERE [(a)-[:ACTED_IN]->(m:Movie) | id(m)] = [movieId]
RETURN a发布于 2021-12-01 21:16:27
作为其他答案的替代方案,您可以这样做
MATCH (a:Movie)
WHERE ID(a) = 11
MATCH (b:Actor)-[:ACTED_IN]->(a)
// Make sure there are no ACTED_IN relationships apart from the one to a
AND NOT (:Movie)<-[:ACTED_IN]-(b)-[:ACTED_IN]->(a)
RETURN b这可能有一个次要的优点,因为它不会首先收集参与者的所有:ACTED_IN关系,而是可以在找到其他关系时立即退出查询。
如果您还想删除具有IS_FRIENDS_WITH关系的查询,则可以将查询修改为
MATCH (a:Movie)
WHERE ID(a) = 11
MATCH (b:Actor)-[:ACTED_IN]->(a)
// Make sure no other relationships exist
AND NOT ()<-[]-(b)-[:ACTED_IN]->(a)
RETURN bhttps://stackoverflow.com/questions/70144182
复制相似问题