如何在Neo4j中获取用户看过影片的2个紧密关联电影节点
解决Neo4j电影推荐查询问题
原查询的问题
你的原查询用了[*]任意长度路径,会匹配从看过的电影出发的所有深度关联,包括非常间接的关系(比如A→关键词→B→关键词→C→关键词→D),结果会太宽泛;同时没排除用户已看的电影,也没按关联紧密性排序,自然得不到预期的紧密相关结果。
针对“紧密相关”的查询方案
紧密相关最直接的定义是和用户看过的电影共享同一关键词,也就是路径为movie→keyword→movie,以下是两种常用查询:
方案1:获取全局最相关的2部电影
这个查询会统计所有和用户看过电影共享关键词的影片,按共享关键词数量排序(数量越多关联越紧密),返回前2部未看过的电影:
MATCH (u:user {userId:'0c8b9291d7b94e1fa24564cef2aa5bfe'})-[:watched]->(watchedMovie:movie) MATCH (watchedMovie)-[:has_keyword]->(keyword:keyword)<-[:has_keyword]-(relatedMovie:movie) WHERE NOT EXISTS((u)-[:watched]->(relatedMovie)) WITH relatedMovie, COUNT(DISTINCT keyword) AS sharedKeywordsCount ORDER BY sharedKeywordsCount DESC LIMIT 2 RETURN relatedMovie.title AS recommendedMovie
- 注意:如果你的电影和关键词之间的关系不是
has_keyword,替换成实际的关系名称(比如related_to)。 WHERE NOT EXISTS(...)用来排除用户已经看过的电影,避免重复推荐。
方案2:给每部看过的电影各推荐2部相关影片
如果你想针对用户看过的每一部电影,分别推荐最相关的2部:
MATCH (u:user {userId:'0c8b9291d7b94e1fa24564cef2aa5bfe'})-[:watched]->(watchedMovie:movie) MATCH (watchedMovie)-[:has_keyword]->(keyword:keyword)<-[:has_keyword]-(relatedMovie:movie) WHERE NOT EXISTS((u)-[:watched]->(relatedMovie)) WITH watchedMovie.title AS watchedTitle, relatedMovie.title AS relatedTitle, COUNT(DISTINCT keyword) AS sharedCount ORDER BY watchedTitle, sharedCount DESC WITH watchedTitle, COLLECT(relatedTitle)[0..2] AS topRelatedMovies RETURN watchedTitle, topRelatedMovies
内容的提问来源于stack exchange,提问作者Pavuluri Virat Chowdary
相关产品推荐
相关产品推荐

