Gremlin 使用检索顶点计数从重复步骤中断

Gremlin 使用检索顶点计数从重复步骤中断,gremlin,tinkerpop,amazon-neptune,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个

我有一个图形结构,看起来如下所示:

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()
可能是一个解决方案,但我无法控制它

请有人给我指出解决这个问题的正确方向。我可能试图使用错误的遍历技术来解决这个问题,但这是我能找到的最接近于似乎有意义的东西


干杯

经过数小时的测试和重读:。我相信我现在掌握了DFS在海王星和小精灵穿越中的运作方式,这已经找到了一个解决方案。但是如果你要用这个,请带一粒盐。从其他人那里验证一下,这是我所期望的,这会很好

我的印象是海王星会先评估重复的穿越(整体),然后评估前面的步骤。看了上面的链接后,我认为这种解释是错误的。相反,它将计算遍历的每个repeat/until+继续步骤,直到满足某些条件,例如
.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()
如果我的思维不正常,请给我一个评论。谢谢