我的数据库中有两种节点: 1)用户 2)媒体 3)标签
我还与所有媒体节点建立了关系:
(:媒体) - [:IS_SIMILAR] - (:媒体)
另一种关系(:媒体) - [:HAS_TAG] - (:标签)
另一种关系(:用户) - [:LIKES] - (:媒体)
这是一个可视化:
此IS_SIMILAR关系具有属性相似性。通过计算每个节点对共有的标签数来计算该属性相似性。
我正在尝试通过查找用户喜欢的媒体并根据相似性属性获取前10个媒体来执行基于内容的过滤。
我构造了以下查询:
Match(u:User{id:"Dorian"})-[:LIKES]-(m:Media)
WITH collect(m) as mu
UNWIND mu as m
Match(m)-[s:ISSIMILAR]-(o:Media)
WHERE NOT o in mu
RETURN DISTINCT o,s ORDER BY s.similarity DESC
得到以下结果:
不幸的是,存在重复的媒体节点,因为用户喜欢的每个媒体节点也与其他媒体节点具有IS_SIMILAR关系。
你能建议:
1)我如何避免这个问题
2)使用我的架构执行基于内容的推荐的另一种方法?
答案 0 :(得分:1)
你快到了。这应该有效:
MATCH (u:User{id:"Dorian"})-[:LIKES]-(m:Media)
WITH collect(m) as mu
UNWIND mu as m
MATCH (m)-[s:ISSIMILAR]-(o:Media)
WHERE NOT o IN mu
WITH o ORDER BY s.similarity DESC
RETURN DISTINCT o;
不幸的是,Cypher不喜欢RETURN DISTINCT o ORDER BY s.similarity DESC
,但接受逻辑等效的WITH o ORDER BY s.similarity DESC RETURN DISTINCT o
。