如何限制遍历分支的次数

时间:2016-11-01 18:31:20

标签: gremlin tinkerpop3

从玩具图开始,我可以通过查找已经“创建”边缘的边来找到哪些顶点是创建者:

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所遵循的路径。如果创建者可以是超级节点,我想告诉查询一旦找到第一个“创建”边缘就输出'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')

有更好的食谱吗?

编辑:我刚在doc(示例2)中找到了一个示例,该示例显示存在被评估为真值的链接(可能没有正确写入这一点):

graph.traversal().V().where(out('created')).values('name')

有一个关于星图问题的警告,我认为这不适用于此,因为,我猜测,只有一个测试分支的步骤?

1 个答案:

答案 0 :(得分:3)

你的最后一个例子是要走的路。

g.V().where(out('created')).values('name')

策略会为您优化并将其转化为:

g.V().where(outE('created')).values('name')

此外,.where(outE('created'))不会遍历所有的边缘,它就像.hasNext()一样,因此没有超级节点问题。