用于大型数据集的neo4j中基于内容的重新系统

时间:2015-02-08 13:53:24

标签: sql database neo4j recommendation-engine nosql

我正在尝试建立一个推荐的书籍网站。我已经抓取了一些图书网站,并且在数据库中有大约1500万册单独的书籍,这些书籍位于 neo4j

现在对于某些类型,如神秘和惊悚,至少有大约100万本书。我必须列出前20名的建议清单。我目前的做法 -

  1. 获取书籍
  2. 进行相似性比较(vec-cosine或pearsons)
  3. 排序和显示
  4. 价格昂贵,需要时间,对实时系统来说并不是很好。我想通过将neo4j链接到传统数据库并通过neo4j从该数据库中获取最高数据库来保留每个类型的排序列表。但这也很慢(需要几十秒)。有更简单,更直观的方法吗?任何想法都会有所帮助。

1 个答案:

答案 0 :(得分:2)

最好知道您希望建议的其他标准,例如:你究竟如何衡量书籍之间的相似性。我假设它不是纯粹基于流派的。

我们对这些密集节点(例如您的类型或人们居住的城市等)采取的一种方法是首先根据其他一些标准找到建议,然后提高建议的相关性得分(如果它)连接到正确的密集节点。这样的查询效率更高。

例如,当推荐20个人你应该成为朋友时,我会根据所有其他标准找到100个候选人,然后提高与我们推荐的用户生活在同一位置的候选人的分数。这是100次单跳遍历,这将非常快。

看看this recent webinar recording,你可能会在其中找到一些灵感。

关于相似性度量,可能需要预先计算这些度量,通过SIMILAR_TO关系将类似的书籍链接在一起。这样的预计算可以使用RuntimeGraphAware Framework来完成,NodeRank仅在安静时段执行此背景计算,因此不会干扰您的常规事务处理。查看{{3}}模块,该模块在静默期间计算Neo4j中的PageRank。