如何限制遍历分支的次数
How to limit the number of times a branch is traversed
从玩具图开始,我可以通过查找具有 'created' 个出边的边来找到哪些顶点是创建者:
gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
graph.traversal().V().as('a').out('created').select('a').values('name')
==>marko
==>josh
==>josh
==>peter
我可以使用去重步骤过滤掉重复项...
gremlin> graph.traversal().V().as('a').out('created').select('a').dedup().values('name')
==>marko
==>josh
==>peter
...但这只会改变输出,不会改变 Gremlin 遵循的路径。如果创建者可以成为超级节点,我想告诉查询在找到第一个 'created' 边缘后输出 'a',然后停止遍历当前 'a' 的输出步骤并继续下一个 'a'。这能做到吗?
此语法具有所需的输出。他们的行为是否如我所愿?
graph.traversal().V().where(out('created').count().is(gt(0))).values('name')
graph.traversal().V().where(out('created').limit(1).count().is(gt(0))).values('name')
有更好的食谱吗?
编辑:我刚刚在 where 文档(示例 2)中找到了一个示例,该示例显示 link 的存在被评估为真实(可能措辞不正确):
graph.traversal().V().where(out('created')).values('name')
有一条关于星图问题的警告,我认为它不适用于此处,因为我猜,只有一个测试分支的步骤?
你的最后一个例子就是要走的路。
g.V().where(out('created')).values('name')
策略将为您优化并将其转化为:
g.V().where(outE('created')).values('name')
此外,.where(outE('created'))
不会遍历所有出边,它就像一个.hasNext()
,因此没有超节点问题。
从玩具图开始,我可以通过查找具有 'created' 个出边的边来找到哪些顶点是创建者:
gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
graph.traversal().V().as('a').out('created').select('a').values('name')
==>marko
==>josh
==>josh
==>peter
我可以使用去重步骤过滤掉重复项...
gremlin> graph.traversal().V().as('a').out('created').select('a').dedup().values('name')
==>marko
==>josh
==>peter
...但这只会改变输出,不会改变 Gremlin 遵循的路径。如果创建者可以成为超级节点,我想告诉查询在找到第一个 'created' 边缘后输出 'a',然后停止遍历当前 'a' 的输出步骤并继续下一个 'a'。这能做到吗?
此语法具有所需的输出。他们的行为是否如我所愿?
graph.traversal().V().where(out('created').count().is(gt(0))).values('name')
graph.traversal().V().where(out('created').limit(1).count().is(gt(0))).values('name')
有更好的食谱吗?
编辑:我刚刚在 where 文档(示例 2)中找到了一个示例,该示例显示 link 的存在被评估为真实(可能措辞不正确):
graph.traversal().V().where(out('created')).values('name')
有一条关于星图问题的警告,我认为它不适用于此处,因为我猜,只有一个测试分支的步骤?
你的最后一个例子就是要走的路。
g.V().where(out('created')).values('name')
策略将为您优化并将其转化为:
g.V().where(outE('created')).values('name')
此外,.where(outE('created'))
不会遍历所有出边,它就像一个.hasNext()
,因此没有超节点问题。