我正在努力使用 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
谢谢你的帮助