如何让所有路径(顶点)从Java中的顶点辐射出来?

时间:2016-11-19 22:47:37

标签: amazon-dynamodb graph-databases titan

我在DynamoDB上使用Titan。我有一个没有周期的有向边图。给定一个顶点,我需要从该顶点辐射出的所有路径。路径仅表示从给定顶点辐射出的每条路径上的顶点列表。

我无法理解Gremlin和Groovy,所以我希望Java中存在一个解决方案。

或者是否有可以转换为Java的Gremlin查询?

1 个答案:

答案 0 :(得分:5)

dynamodb-titan基于TinkerPop 3.x和TinkerPop 3.x Gremlin不受Groovy的约束。 Groovy中的Gremlin基本上等同于Java。如果你不学习Gremlin,你将无法与Titan(或TinkerPop)相处,因为它是查询图表的唯一方法。

获取遍历路径需要使用path()步骤。为了演示我将使用Gremlin控制台,并且在使用Groovy进行评估时,我可以向您保证,您可以将此代码复制并粘贴到Java项目中,并且它可以在那里工作得很好。

首先,我创建了我将演示的玩具图:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

接下来,我编写一个遍历,找到id为1的单个顶点 - 这将是我们将用于发现您正在寻找的“辐射路径”的顶点:

gremlin> g.V(1)
==>v[1]

然后我们从1:

遍历边缘到相邻顶点
gremlin> g.V(1).out()
==>v[3]
==>v[2]
==>v[4]

然后我们再做一次:

gremlin> g.V(1).out().out()
==>v[5]
==>v[3]

现在,如果我们想要看到遍历者到达那里的路径,我们就这样做:

gremlin> g.V(1).out().out().path()
==>[v[1],v[4],v[5]]
==>[v[1],v[4],v[3]]

并且存在从单个顶点辐射的所有顶点,这些顶点与1完全相差两步。

如果您不知道从起点开始走的长度,那么您可以使用repeat()

gremlin> g.V(1).repeat(out()).until(outE().count().is(0)).path()
==>[v[1],v[3]]
==>[v[1],v[2]]
==>[v[1],v[4],v[5]]
==>[v[1],v[4],v[3]]