我使用数据库电影(演员和电影)。它有关系(:ACTOR) - [:ACTED_IN] - >(:电影)。现在我想找到演员“abc”所扮演的所有电影的演员。
我的想法是首先使用WITH COLLECT获取“abc”的电影收藏。然后使用ALL()查找所需的actor。但我不知道如何在ALL()中编写过滤器。怎么写呢?
答案 0 :(得分:1)
在performing match intersection上查看这篇关于Neo4j知识库的文章。
您正在寻找的查询类型将类似。
例如,使用上面提到的第一种技术,我们可以这样做:
MATCH (abc:Actor{name:'abc'})-[:ACTED_IN]->(m:Movie)
WITH abc, collect(distinct m) as movies
WITH abc, movies, size(movies) as movieCnt
UNWIND movies as m
MATCH (m)<-[:ACTED_IN]-(a:Actor)
WHERE abc <> a
WITH a, collect(distinct m) as commonMovies, movieCnt
WHERE size(commonMovies) = movieCnt
RETURN a
如果您想使用ALL()的替代方法,它可能如下所示:
MATCH (abc:Actor{name:'abc'})-[:ACTED_IN]->(m:Movie)
WITH abc, collect(distinct m) as movies
WITH abc, movies, head(movies) as first
MATCH (first)<-[:ACTED_IN]-(a:Actor)
WHERE abc <> a AND ALL(m in movies WHERE (m)<-[:ACTED_IN]-(a))
RETURN a
我们从第一部电影集开始比赛,所以我们从一组相关的开始:Actors而不是从all开始过滤:Actor节点。如果我们按照首先提升的演员数量对电影进行排序,那么这可以进一步改善,因为这将导致最窄的起点库。