我正在使用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
是否适合将这四种情况分组?
答案 0 :(得分:2)
是的,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