如何在给定起点并且不知道最终结果的情况下遍历图形?

时间:2013-12-19 15:40:51

标签: gremlin orientdb tinkerpop

假设我的图形看起来像一个变量arity的树。我有Vertex,除了id0之外,我对最后一点的位置一无所知。我已经看到了Gremlin用法的一些例子,但是找不到合适的例子 - 它们基本上都是x.out.in.out之类的东西,等等,这在我的情况下是不适用的。我也使用Java绑定,所以如果你的答案是关于这个事实,我将不胜感激。

P.S。也许我应该更具体一点。我还想收集所有properties个节点,因此如果存在某种reduce / foldLeft等,但仅适用于pipe s - 那真是太棒了。

1 个答案:

答案 0 :(得分:0)

Tinkerpop Toy Graph的示例(找到从vadas [vertex 2]到peter [vertex 6]的路径):

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> start = g.v(2)
==>v[2]
gremlin> end = g.v(6)
==>v[6]
gremlin> start.as("x").both().loop("x", {it.object != end}, {true}).retain([end]).path()[0]
==>[v[2], v[1], v[3], v[6]]

查询不是最佳的,如果您不限制结果数量,它将永远运行,但它应该回答您的问题。

如果您想要所有属性:

gremlin> start.as("x").both().loop("x", {it.object != end}, {true}).retain([end]).path().transform({ it.collect({ it.map() }) })[0]
==>[{age=27, name=vadas}, {age=29, name=marko}, {name=lop, lang=java}, {age=35, name=peter}]

如果您只需要一个属性:

gremlin> start.as("x").both().loop("x", {it.object != end}, {true}).retain([end]).path().transform({ it.collect({ it.name }) })[0]
==>[vadas, marko, lop, peter]

干杯, 丹尼尔