【问题标题】:Recommending things to do with Neo4j推荐与 Neo4j 相关的事情
【发布时间】:2015-03-31 00:05:08
【问题描述】:

我正在使用 Java 和 Neo4j 开发一个简单的社交网络。

用户可以提交他们已经完成的事情并用一些标签来标记它们。用户也可以添加一些兴趣(也是标签)。 系统应该向用户推荐他还没有做的事情。 我读过一些关于协同过滤的文章,其中计算用户之间的相似性。找到相似用户后,他们做过但登录用户还没有做过的一些事情,将完美匹配推荐。

这是数据模型:

(me)-[:HAS_DONE]->(thing)-[:IS_TAGGED_WITH]->(tag)<-[:IS_TAGGED_WITH]-(theirThing)<-[:HAS_DONE]-(people)

(me)-[:HAS_DONE]->(thing)-[:IS_TAGGED_WITH]->(tag)<-[:IS_INTERESTED_IN]-(people)

(me)-[:IS_INTERESTED_IN]->(tag)<-[:IS_TAGGED_WITH]-(theirThing)<-[:HAS_DONE]-(people)

(me)-[:IS_INTERESTED_IN]->(tag)<-[:IS_INTERESTED_IN]-(people)

Collaborative filtering usually deals with some ratings.

对于有标签的情况,我们做如下记号:

U={u_1, u_2,..., u_n} - users

I={i_1, i_2,..., i_m} - interests

T={t_1, t_2,..., t_k} - things

UIsim(u_i, u_j) - 两个用户的兴趣相似度。它的计算方法是将共同兴趣数除以一个用户添加的最大兴趣数。

UTsim(u_i, u_j) - 两个用户事物的相似度。它的计算方法是将事物的常用标签数除以一个用户添加的最大标签数。

两个用户之间的最终相似度为 w1*UIsim(u_i, u_j)+w2*UTsim(u_i, u_j),其中 w1+w2=1。

是否可以用 Cypher 实现这个公式?我的意思是有max 功能吗? UNION 是否适合对这四种情况进行分组?

【问题讨论】:

    标签: neo4j recommendation-engine collaborative-filtering


    【解决方案1】:

    是的,Cypher 中有一个 max 函数,请参见此处:http://neo4j.com/docs/stable/query-aggregation.html#aggregation-max

    但是,根据图表的大小,使用 java api 可能更有效。

    UNION 可用于返回所有结果。

    还有一个 neo4j reco 插件,它为过滤和推荐过程提供了高级可能性:

    https://github.com/graphaware/neo4j-reco

    您可以在这里找到幻灯片:http://www.slideshare.net/bachmanm/recommendations-with-neo4j-fosdem-2015

    星期四有一个关于这个插件的网络研讨会:http://info.neo4j.com/0205-register.html?_ga=1.197373423.1723877819.1422809612

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多