我正在努力使用Cypher对我的用户活动进行采样。
我的图表是什么样的
我的Graph中有数百万用户使用索引属性UserId进行记录器。
我有几百个带有索引属性ItemId的产品。
我的用户可以[交互]与我的产品。
我想做的事
我想对路径用户-[交互]-产品-[交互]-用户-[交互]-产品有一个大致的了解。用简单的英语来说,我想知道看起来很像的用户正在与哪些产品交互。例如,如果我与产品A和B交互,与这些产品交互的用户通常会与这些其他产品交互。
这就是亚马逊所做的。
我的问题
我不能简单地匹配上面的模式,执行时间太长了。所以我想我只能对我的用户进行采样,并且我可以执行以下操作:
但我不知道这是否可能在一个单一的Cypher查询中实现。
我最接近的是下面的查询。但是它仍然太长了,而且它没有做我想要的。基本上,它给我“最新”用户使用的最新产品,该用户与root用户具有共同的“最新”产品,这在我看来是合乎逻辑的,但无法对我的用户的活动进行采样。
START u=node:node_auto_index('UserId:9554')
MATCH
u-[i1:INTERACTS]-p1
WITH
u,p1,i1
LIMIT 20
MATCH
p1-[i2:INTERACTS]-u1
WHERE
NOT(u1=u)
WITH
i1,i2,u1,p1
LIMIT 400
MATCH
u1-[i3:INTERACTS]-p
WHERE
NOT(p1=p) AND p.ProjectId = {ProjectId} AND p.IsActive? = 1
RETURN
i1.Label, i2.Label,i3.Label, p.ItemId,count(p) as count
LIMIT 8000
我现在身处何方
在一些不成功的测试之后我尝试使用JavaAPI来编写它它更加简单直接但是出于好奇并且因为现在我的系统使用Cypher我想知道如何做到这一点
为了测试,我认为我的问题可以简化为:给定一个模式,每个深度的最后2个节点是什么。
我创建了http://console.neo4j.org/?id=inf2hn来测试它。我想我正在寻找的最终结果应该是这样的:
Product 2 | User 3 | Product 5
Product 2 | User 3 | Product 6
Product 2 | User 4 | Product 5
Product 2 | User 4 | Product 6
Product 3 | User 3 | Product 5
Product 3 | User 3 | Product 6
Product 3 | User 4 | Product 5
Product 3 | User 4 | Product 6
谢谢你的帮忙
我认为你在评论中提到的反映了这样一个事实,即它可能不仅仅是一个简单的查询。我已经使用Neo4j编写了推荐,对我来说,它看起来像是你需要它来解释与产品的所有不同类型的交互以及它们的重要性。基于此,你为用户形成一个产品交互的排名列表,即用户最“感兴趣”的产品。要找到要推荐给另一个用户的产品,你可以计算用户与其他人的相似程度,然后将这些作为推荐产品的起点(如果我的品味与你相似,我可能会对你的相同产品感兴趣)。
一些可能有帮助的博客:
http://blog.everymansoftware.com/2012/02/similarity-based-recommendation-engines.html
http://thought-bytes.blogspot.in/2012/02/similarity-based-recommendations-with.html
免责声明:我是思想字节博客的所有者。
好吧,我认为您正在尝试为用户提供一些像推荐一样的想法…如果这正是您正在寻找的,我最近为用户和产品构建了自己的推荐引擎…
假设我们有用户A购买产品1,2,3和用户B购买1,2,4…所以如果想根据A, B之间的相似性为用户A推荐产品,它将是产品4…
在cypher中,它看起来像这样:
Start inputUser=node:usersIndeinputUser(USER_NAME='A')
MATCH (inputUser)-[rel1:BUY]->(common_products)<-[rel2:BUY]-(otherUser)-[rel3?:BUY]->(rec_product)
With rec_product,inputUser, otherUser
WHERE NOT (rec_product)<-[:BUY]-(inputUser)
RETURN inputUser , rec_product, , otherUser
我希望它能帮助你…