Neo4j movies数据集查询:最多演员电影及合作最多演员对查询方法
Neo4j Movies数据集两类查询实现方案
默认使用Neo4j官方提供的Movies示例数据集,实体标签、关系类型和官方默认定义一致:人物标签为Person,电影标签为Movie,演员参演电影的关系类型为ACTED_IN。
需求1:查找参演演员数量最多的电影
实现思路:匹配所有演员和参演电影的关联关系,按电影分组统计关联的演员总数,按统计值倒序排序后取最高值即可。
基础版(仅取1条最高记录)
适合快速验证查询逻辑,忽略并列第一的情况:
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie) WITH movie, count(actor) AS actor_count ORDER BY actor_count DESC LIMIT 1 RETURN movie.title AS 电影名称, actor_count AS 参演演员数量
兼容并列版(返回所有并列最高的电影)
如果有多部电影参演演员数相同且都是最高,会全部返回:
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie) WITH movie, count(actor) AS actor_count // 先收集所有电影的统计结果,同时算出最大参演人数 WITH collect({title: movie.title, count: actor_count}) AS all_movie_stats, max(actor_count) AS max_actor_count // 筛选出所有参演人数等于最大值的电影 UNWIND [item IN all_movie_stats WHERE item.count = max_actor_count] AS top_movie RETURN top_movie.title AS 电影名称, top_movie.count AS 参演演员数量
需求2:查找共同参演电影数量最多的演员组合
实现思路:匹配两个演员共同参演同一部电影的关系,通过id(a1) < id(a2)的条件避免重复配对(不会同时出现「A和B」「B和A」两组相同结果,也排除了演员自己和自己配对的无效数据),按演员组合分组统计共同参演的电影总数,取统计值最高的组合即可。
基础版(仅取1组最高记录)
MATCH (a1:Person)-[:ACTED_IN]->(movie:Movie)<-[:ACTED_IN]-(a2:Person) WHERE id(a1) < id(a2) WITH a1.name AS 演员1, a2.name AS 演员2, count(movie) AS 共同参演电影数 ORDER BY 共同参演电影数 DESC LIMIT 1 RETURN 演员1, 演员2, 共同参演电影数
兼容并列版(返回所有并列最高的演员组合)
MATCH (a1:Person)-[:ACTED_IN]->(movie:Movie)<-[:ACTED_IN]-(a2:Person) WHERE id(a1) < id(a2) WITH a1.name AS actor1, a2.name AS actor2, count(movie) AS co_count WITH collect({a1: actor1, a2: actor2, count: co_count}) AS all_pair_stats, max(co_count) AS max_co_count UNWIND [pair IN all_pair_stats WHERE pair.count = max_co_count] AS top_pair RETURN top_pair.a1 AS 演员1, top_pair.a2 AS 演员2, top_pair.count AS 共同参演电影数
小提示:如果需要同时返回两人共同参演的具体电影列表,可在分组统计时新增
collect(movie.title)属性存储电影名列表。
内容的提问来源于stack exchange,提问作者william nguma
相关产品推荐
相关产品推荐

