You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:25:36