使用Neo4J计算排名数据库中两个用户的相似度

时间:2014-02-15 18:40:42

标签: neo4j

我正在使用Neo4J来处理拥有用户及其电影排名的数据集。我有两种节点类型 - 电影和用户以及一种将用户的等级赋予电影的关系。

我的目标是根据用户与其他用户之间的相似性来探索用户的预测能力。

为此,我想计算用户之间的相似度,作为他们所观看的电影的归一化排名总和。然后,该信息应存储在用户之间的关系中。

我对以下两个特定节点进行了以下Cypher查询:

MATCH (a)-[r1:RANKS]->(m), (b)-[r2:RANKS]->(m) where a.ID<>b.ID return a.ID,b.ID, sum(abs(r1.Rate-r2.Rate))/count(m)

我想使用此查询也创建一个关系,但是一旦我尝试以下内容:

MATCH (a)-[r1:RATES]->(m)<-[r2:RATES]-(b) where a.ID<>b.ID and a.ID="u_1" and b.ID="u_753" CREATE a-[:SIMILARITY_RANK{Similarity:(abs(r1.Rank-r2.Rank))/count(m)}]->(b)

我收到的错误消息是我在错误的上下文中使用了count函数。我做错了什么?

多坦

2 个答案:

答案 0 :(得分:1)

适合我(稍微清理一下):

MATCH (a:User)-[r1:RANKS]->(m:Movie)<-[r2:RANKS]-(b:User) 
WHERE a.ID<>b.ID 
RETURN a.ID,b.ID, sum(abs(r1.Rate-r2.Rate)) / count(m)

请参阅:http://console.neo4j.org/r/4zb8fg

创建你的rel我会做

MATCH (a:User)-[r1:RANKS]->(m:Movie)<-[r2:RANKS]-(b:User) 
WHERE a.ID<>b.ID 
WITH a,b, sum(abs(r1.Rate-r2.Rate)) / count(m) as similarity
CREATE a-[:SIMILARITY_RANK {Similarity:similarity}]->(b)

我也在上面的控制台中运行它

MATCH (a:User)-[r1:RANKS]->(m:Movie)<-[r2:RANKS]-(b:User) 
WHERE a.name<>b.name 
WITH a,b, sum(abs(r1.Rate-r2.Rate))/ count(m) AS similarity 
CREATE a-[:SIMILARITY_RANK { Similarity:similarity }]->(b)

答案 1 :(得分:0)

请尝试:

MATCH (a)-[r1:RATES]->(m)<-[r2:RATES]-(b)
where a.ID<>b.ID and a.ID="u_1" and b.ID="u_753"
with count(m) as count,a,b
CREATE a-[:SIMILARITY_RANK{Similarity:(abs(r1.Rank-r2.Rank))/count}]->(b)

count不能在create

中使用