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

如何在所有项目节点相互连接的情况下执行基于内容的过滤neo4j,neo4j,Neo4j,我的数据库中有两种节点: 1) 使用者 2) 媒体 3) 标签 我还与所有媒体节点建立了如下关系: (:媒体)-[:相似]-(:媒体) 和另一个关系(:Media)-[:HAS_TAG]-(:TAG) 和另一个关系(:User)-[:LIKES]-(:Media) 下面是一个可视化: 绿色节点是媒体,蓝色节点是用户(我排除了标记节点) 这是因为相似关系具有属性相似性。该属性相似性是通过计算每个节点对共有的标记数来计算的 我试图通过查找用户喜欢的媒体并根据相似性属性获得前10名媒体来执行基于内容

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

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

(:媒体)-[:相似]-(:媒体)

和另一个关系(:Media)-[:HAS_TAG]-(:TAG)

和另一个关系(:User)-[:LIKES]-(:Media)

下面是一个可视化:

绿色节点是媒体,蓝色节点是用户(我排除了标记节点)

这是因为相似关系具有属性相似性。该属性相似性是通过计算每个节点对共有的标记数来计算的

我试图通过查找用户喜欢的媒体并根据相似性属性获得前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
结果如下:

不幸的是,存在重复的媒体节点,因为用户喜欢的每个媒体节点也与其他媒体节点具有类似的关系

你能建议:

1) 我怎样才能避免这个问题


2) 用我的模式执行基于内容的推荐的另一种方法?

你就快到了。这应该起作用:

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不喜欢通过s.similarity DESC返回不同的o顺序,但接受通过s.similarity DESC返回不同的o顺序的逻辑等价的

非常感谢,非常感谢您的帮助