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()
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()
如果我的思维不正常,请给我一个评论。谢谢