我有一个类似于以下内容的图形结构:
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()
可能是一种解决方案,但我无法解决。
请有人能指出正确的方向来解决这个问题。我可能正在尝试使用错误的遍历技术来解决此问题-但这是我所能接近的最合理的方法。
干杯!
答案 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()
如果我的想法不正确-请发表评论让我知道。谢谢!