【发布时间】: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