使用回退顶点数从重复步骤中中断

时间:2019-11-21 20:15:34

标签: gremlin tinkerpop amazon-neptune

我有一个类似于以下内容的图形结构:

user1 -> user2 -> user3 -> post
user1 -> user4 -> user5 -> post2
user1 -> user4 -> user6 -> post3
user1 -> user5 -> user7 -> post4
user1 -> user5 -> user6 -> post5

我想创建一个遍历,该遍历可以从user1中搜索N个边深,然后在用户顶点上获得深度N处的帖子。这通常是直截了当的。但是我有以下条件:

  • 能够执行深度优先的搜索策略
  • 达到所需帖子数量的给定阈值时,遍历会中断
  • 确保对于每个.repeat()个用户,在.out()中检索到的顶点都是随机的,并且在先前的.repeat()步骤中未使用

这些条件是我本人提出的,希望即使在有大量用户连接和发布顶点的情况下,也可以确保查询时间可以接受。

这是我要在2度深处进行测试的地方:

g.withSideEffect('Neptune#repeatMode', 'DFS')\
    .V(user1)\
    .repeat(__.out("connection").sample(1).out("connection").sample(1).out("post").limit(5).store("posts"))\
    .until(__.select("post").count().is_(50))\
    .values("name")\
    .toList()

此查询从不返回数据,因为它仅在用户的帖子数为50时才会中断。但是这里的帖子数量只能是5,因为每次重复都在重写商店吗? 因此,我认为我需要某种全局状态/存储,可以在其中存储顶点,然后在.until()中对其求值。这有可能吗?我看到使用sack()可能是一种解决方案,但我无法解决。

请有人能指出正确的方向来解决这个问题。我可能正在尝试使用错误的遍历技术来解决此问题-但这是我所能接近的最合理的方法。

干杯!

1 个答案:

答案 0 :(得分:0)

经过更多小时的测试和重新阅读:https://docs.aws.amazon.com/neptune/latest/userguide/gremlin-query-hints-repeatMode.html。我相信我现在掌握了DFS在带有格林姆林遍历的海王星中的运作方式,并且找到了解决方案。但是,如果要使用它,请带一点盐。来自其他人的验证,证明我的预期会奏效。

我的印象是,海王星将首先评估重复遍历(整体),然后评估之前的步骤。在查看以上链接后,我认为这种解释是错误的。取而代之的是,它将评估遍历的每个重复/直到执行的步骤,直到满足诸如.limit()之类的某些条件-或遍历结束并且遍历了所有路径。

请牢记以下几点应按我的意愿进行:

g.withSideEffect('Neptune#repeatMode', 'DFS')\
    .V(user_vertex)\
    .repeat(__.out("connection").simplePath().order().by(Order.shuffle).dedup())\
    .until(__.loops().is_(P.eq(2)))\
    .local(__.out("post").sample(1))\
    .limit(50)\
    .values("name", "user")\
    .toList()

如果我的想法不正确-请发表评论让我知道。谢谢!