对关系属性进行聚合和排序

时间:2015-08-24 08:51:20

标签: neo4j

我是Cypher新手所以我可能会遗漏一些明显的东西,但在阅读了我能找到的所有基本推荐引擎帖子/教程之后,我似乎无法解决这个问题所以所有的帮助都表示赞赏。

我尝试制作一个推荐功能,根据她喜欢的以前地方的标签向用户推荐地方信息。用户与Tag具有LIKES关系,其中包含重量属性。地方与标签有CONTAINS关系,但包含没有与之关联的任何权重。此外,LIKES加权超过特定阈值(0.85)的标签越多,它应该被排序的越高,因此这将添加SUM聚合器。

(User)-[:LIKES]->(Tag)<-[:CONTAINS]-(Place)

我的问题是,我无法根据指向它的与用户有LIKES关系的标签数量订购商店,以及如何使用LIKES权重订购商品。

1 个答案:

答案 0 :(得分:3)

基于以下示例neo4j控制台:http://console.neo4j.org/r/klmu5l

以下查询应该可以解决问题:

MATCH (n:User {login:'freeman.williamson'})-[r:LIKES]->(tag)
MATCH (place:Place)-[:CONTAINS]->(tag)
WITH place, sum(r.weight) as weight, collect(tag.name) as tags
RETURN place, size(tags) as rate, weight
ORDER BY rate DESC, weight DESC

返回:

(42:Place {name:"Alveraville"}) 6   491767416
(38:Place {name:"Raynorshire"}) 5   491766715
(45:Place {name:"North Kristoffer"})    5   491766069
(36:Place {name:"Orrinmouth"})  5   491736638
(44:Place {name:"New Corachester"}) 5   491736001

说明:

  • 我匹配用户和他喜欢的标签
  • 我匹配包含至少一个他喜欢的标签的地方
  • 然后我用WITH来管道rels权重的总和,标签的集合和地方
  • 然后我返回那些,除了我用大小计算集合中的标签数量
  • 全部按降序排列