我是Gremlin和Java的新手。我希望找到两条最短的路径。每个路径必须是唯一/不同的,并且彼此独立。 我尝试过
dedup()
”,但它在全局路径上起作用,而不在构成路径的顶点上起作用。 limit(2)
”当然,但是路径不是独立的(两条路径中存在某些顶点)我不知道是否可以用gremlin做到这一点。
这是我的代码:
List<Object> result = g.V().has("name", "room1").as("from").repeat(out().simplePath())
.until(has("name", "room2")).as("to").path().as("p").select("p").limit(2).toList();
您对格雷姆林有何建议?
答案 0 :(得分:0)
您评论中的示例图:
g = TinkerGraph.open().traversal()
g.addV().property(id, 'd0').
addV().property(id, 'd1').
addV().property(id, 'd2').
addV().property(id, 'd3').
addV().property(id, 'd4').
addV().property(id, 'd5').
addE('link').from(V('d0')).to(V('d1')).
addE('link').from(V('d0')).to(V('d4')).
addE('link').from(V('d1')).to(V('d2')).
addE('link').from(V('d1')).to(V('d4')).
addE('link').from(V('d2')).to(V('d3')).
addE('link').from(V('d4')).to(V('d3')).iterate()
从d0
到d3
的所有路径:
gremlin> g.V('d0').
......1> repeat(out('link').simplePath()).
......2> until(hasId('d3')).
......3> path()
==>[v[d0],v[d4],v[d3]]
==>[v[d0],v[d1],v[d2],v[d3]]
==>[v[d0],v[d1],v[d4],v[d3]]
现在要根据起始顶点和结束顶点之间已经看到哪些顶点来过滤路径,您只需要记住这些顶点并将它们用作进一步顶点的过滤器即可:
gremlin> g.V('d0').
......1> repeat(out('link').simplePath()).
......2> until(hasId('d3')).
......3> path().
......4> filter(unfold().hasId(without('d0','d3')).fold().
......5> filter(unfold().where(without('x'))).
......6> unfold().store('x'))
==>[v[d0],v[d4],v[d3]]
==>[v[d0],v[d1],v[d2],v[d3]]