0

我正在努力使用 Cypher 对我的用户活动进行抽样。

我的图表是什么样的

我的图表中有数百万用户记录器,带有索引属性 UserId。

我有数百个具有索引属性 ItemId 的产品。

我的用户可以与我的产品[交互]。

我正在尝试做的事情

我想对路径user-[INTERACTS]-product-[INTERACTS]-user-[INTERACTS]-product有一个平均的想法。用简单的英语,我想知道相似用户正在与哪些产品进行交互。例如,如果我与产品 A 和 B 交互,与这些产品交互的用户通常会与这些其他产品交互。

这就是亚马逊所做的。

我的问题

我不能简单地匹配上述模式,执行时间太长。所以我认为我只能对我的用户进行抽样,并且我可以执行以下操作:

  • 仅获取我的用户与之交互的最后 20 个产品
  • 仅选择使用上述每种产品的最后 20 位用户
  • 只取这些用户与之交互的最后 20 个产品,并计算每个产品的出现次数

但我不知道这是否可能在一个 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 

我现在在哪里

经过一些更不成功的测试后,我尝试使用 Java API 对其进行编码,它更加简单和直接。但出于好奇,因为现在我的系统使用 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

谢谢你的帮助

4

2 回答 2

1

我认为您在评论中提到的内容反映了一个事实,即它可能不仅仅是一个简单的查询。我已经使用 Neo4j 编写了建议,在我看来,您需要它来说明与产品的所有各种类型的交互以及它们的重要性。在此基础上,您为用户形成产品交互的排名列表,即用户最“感兴趣”的产品。要找到要推荐给其他用户的产品,您可以计算该用户与其他用户的相似程度,然后使用这些作为推荐产品的起点(如果我的口味与您的相似,我可能对与您相同的产品感兴趣)。

一些可能有帮助的博客:

http://blog.everymansoftware.com/2012/02/similarity-based-recommendation-engines.html

http://thought-bytes.blogspot.in/2012/02/similarity-based-recommendations-with.html

免责声明:我是思想字节博客的所有者。

于 2013-06-12T13:41:20.187 回答
0

好吧,我认为您正在尝试为用户提出一些类似的建议。如果这正是您所寻找的,我最近为用户和产品构建了自己的推荐引擎。

假设我们有购买产品 1、2、3 的用户 A 和购买 1、2、4 的用户 B .. 所以如果想根据 A、B 之间的相似性为用户 A 推荐产品,它将是产品 4..

在密码中它看起来像这样:

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 

希望对你有帮助。。

于 2013-06-12T12:41:28.163 回答