2015-03-13 29 views
1

我有一个neo4j数据库,包含用户,曲目和DJ,用户与DJ有相似之处,DJ可以播放曲目。现在我想找出所有由具有与用户相似的DJ,东西打得像在neo4j中找到明确的关系

MATCH (u:User {userId:'6'})-[s:SIMILARITY]->(dj:Dj)-[p:PLAYED]->(t:Track) 
return COUNT(t)*s.similarity AS count,t order by count; 

问题的轨道是DJ的可以多次,我已经由多个PLAYED代表播放音轨DJ和曲目之间的关系。所以如果一个dj多次播放曲目,它会通过这个查询获得更多的权重,而我只想让这些多个关系计数一次。

的解决方案可能是一些与DISTINCT,但我不知道在哪里把它(计数(不同T)没有得到期望的结果)。另一种方法是将数据库重构为只有一个PLAYED关系,并将PLAYED的timestamp属性存储为一个数组。

在这种情况下,我想执行一个查询(其他地方)问:“找到所有跟踪该时间戳在此之后跟着DJ播放”,这也将解决这个问题,但我不知道怎么办。

在此先感谢

回答

2

您的cypher语句已经非常接近解决方案。但是你汇总的轨道和要使用的关系的计数到赛道的重量,请注意,我已经改变了count(t)count(p)

MATCH (u:User {userId:'6'})-[s:SIMILARITY]->(dj:Dj)-[p:PLAYED]->(t:Track) 
return t, COUNT(p)*s.similarity AS weight order by weight; 
+0

这么简单,谢谢! – user3136936 2015-03-13 09:14:44