1

我正在使用链接列表来跟踪用户的活动,但我想跟踪每个活动,而不仅仅是最近 20 个左右。所以随着时间的推移,用户可能在列表中有 5000 个节点。( Neo 1.9,Neography Gem,ROR 3.2...)

当我使用 cypher 遍历列表时,只要跃点数低于 40 左右,它就会很好......但是.. 有数千个节点,40 不会削减它.. 如果我使用更大的数字, Neo 基本上被捆绑了很长一段时间..

问题是这样的.. 说一个用户不久前喜欢了一张照片,说在最近的之前有 1000 次动作,出于某种奇怪的原因,他们想要不像一张照片.. 好吧,我必须从活动中剪掉那个节点链表。问题是,我必须找到埋藏在 1000 个节点深处的活动节点。因此,似乎没有冻结的 40 个跃点根本不起作用

当我运行以下密码查询时,只需几分钟,如果它完成的话..(:ACTIVITIES_FIRST_NODE 是链表的头)

START viewer_who_liked=node(2675)
MATCH viewer_who_liked-[:ACTIVITIES_FIRST_NODE|ACTIVITIES_NEXT_NODE*]-activity_list_node-[:LIKES_PHOTO]->object 
RETURN id(activity_list_node)

如果我将其更改为 [:ACTIVITIES_FIRST_NODE|ACTIVITIES_NEXT_NODE*1..30] 它不会冻结,但不会找到我正在寻找的节点。而且 where 函数是无用的,因为它似乎是在评估之后活动节点的遍历..我使用 with 子句无济于事..我还尝试了步进和限制-没有骰子..它总是超时...

现在,如果我使用限制并跳过它不会爆炸,但它也不会返回我正在寻找的节点,除非我计划遍历列表的块......但我正在寻找一个结果,并且快速,并且不想遍历记录集..(这适用于分页的活动提要,但不是在大海捞针..我需要大海捞针..)

所以,我想知道,我是否应该将活动节点放在索引上(除了放在链表上 - 链表非常适合活动提要等),并搜索索引以检索正确的活动节点,然后执行删除目标节点?或者我在这里忽略了什么/做错了什么..

4

1 回答 1

3

当用户“不喜欢”图片时,您是否有足够的信息立即检索“对象”节点?您能否同时绑定用户和对象,遵循[:LIKES_PHOTO]对象节点与某个活动节点的传入关系,并查看哪些活动节点连接到正确的用户节点?就像是

START photo=node(5762), user=node(2675)
MATCH photo<-[r:LIKES_PHOTO]-(like_event), user-[:FIRST]->(first_event)
WHERE first_event-[:NEXT*1..1000]->like_event
DELETE r

我认为WHERE上面条款中的模式比从用户到他喜欢的所有照片的模式匹配更便宜,测试属性以找到合适的。


使用您的查询和模型尝试的其他一些事情:

1)在变长关系上声明方向,即-[:NEXT*1..100]->。即使遍历每一步只能沿着一个关系进行,但当方向明确时,它仍然明显更快。在与您的结构相似的结构上进行测试,添加方向将 TraversalMatcher 的 db 命中数减少了 75%(如下)。

2)如果您可以将可能的深度缩小到某个有限范围,请这样做。查询(a)-[:NEXT*90..110]->(b)-[:DATA]->(c)(a)-[:NEXT*..100]->(b)-[:DATA]->(c). 您可以通过这种方式对流进行某种迭代搜索或分页,尽管我没有尝试过。

3)如果某些关系只发生一次(你[:ACTIVITIES_FIRST_NODE]可能),那么不要将它包含在模式的可变深度部分中。在与您类似的结构上,使用这些模式分析匹配时,TraversalMatcher 按如下方式命中数据库

(a)-[:DATA|NEXT*45..55]-(b)         //_db_hits=212366
(a)-[:DATA|NEXT*45..55]->(b)        //_db_hits=53566
(a)-[:NEXT*45..55]-()-[:DATA]-(b)   //_db_hits=418
(a)-[:NEXT*45..55]->()-[:DATA]->(b) //_db_hits=107

4)如果匹配(a)-[:NEXT*..1000]->(b)没有返回,匹配shortestPath( (a)-[:NEXT*..1000]->(b) )可能。我不知道为什么,但是当我测试它时,前一种模式shortestPath()在大约 200 毫秒内返回时从悬崖上跑了下来。它可能与查找一些与所有匹配路径有关,也可能与深度与广度优先遍历顺序有关,但我还没有研究过。

5)如果系列太长,把它们分开。每天/每周或为每个第 N 个成员创建一个新系列,或者以某个时间间隔(也可以按某个时间或数量)将用户直接与系列中的步骤相关联。这将是一个类似的解决方案,可以像您提到的那样对活动节点进行索引)。

于 2013-12-16T15:42:50.093 回答