如何执行基于内容的过滤neo4j与所有项目节点相互连接

时间:2018-04-07 14:50:47

标签: neo4j

我的数据库中有两种节点: 1)用户 2)媒体 3)标签

我还与所有媒体节点建立了关系:

(:媒体) - [:IS_SIMILAR] - (:媒体)

另一种关系(:媒体) - [:HAS_TAG] - (:标签)

另一种关系(:用户) - [:LIKES] - (:媒体)

这是一个可视化:

The green nodes are media and blue is a user 绿色节点是媒体,蓝色是用户(我排除了标签节点)

此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

得到以下结果:

enter image description here 不幸的是,存在重复的媒体节点,因为用户喜欢的每个媒体节点也与其他媒体节点具有IS_SIMILAR关系。

你能建议:

1)我如何避免这个问题

2)使用我的架构执行基于内容的推荐的另一种方法?

1 个答案:

答案 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