如何使用有序边从顶点遍历并维持两步之外的排序

How to traverse from a vertex using ordered edges and sustain ordering for two steps away

我有这个图表示例:

我想做的是用以下内容填充有序列表:

保持 ContainsB

order 属性 的顺序

这是我目前没有任何订购的:

Map<String, Object> map = g.V(a.id())
            .project("A", "ContainsBEdges", "CVertices","DVertices")
            .by()
            .by(outE("ContainsB").fold())
            .by(outE("ContainsB").inV().out("ContainsC").fold())
            .by(outE("ContainsB").inV().out("ContainsD").fold())
            .next();

我有类似的想法,尽管从小例子来看它不适用于两步之遥 by() 表达式:

Map<String, Object> map = g.V(a.id())
            .project("A", "ContainsBEdges", "CVertices","DVertices")
            .by()
            .by(outE("ContainsB").order().by("order").fold())
            .by(outE("ContainsB").order().by("order").inV().out("ContainsC").fold())
            .by(outE("ContainsB").order().by("order").inV().out("ContainsD").fold())
            .next();

稍后我做:

Vertex a = (Vertex) map.get("A");
List<Edge> containsBEdges = (List<Edge>) map.get("ContainsBEdges");
List<Vertex> cVertices = (List<Vertex>) map.get("CVertices");
List<Vertex> dVertices = (List<Vertex>) map.get("DVertices");

根据 Gremlin 文档,我不应该依赖任何顺序,除非它是显式的 order() 所以我想知道如何遍历以一组显式有序边开始的有序路径并确保事情将继续与下一个版本一起工作。

谢谢!

让我们从创建图表的脚本开始,以便其他人可以跟进:

g = TinkerGraph.open().traversal()
g.addV("A").property(id, 5).as("a").
  addV("B").property(id, 8).as("b1").
  addV("B").property(id, 9).as("b2").
  addV("C").property(id, 1).as("c1").
  addV("C").property(id, 3).as("c2").
  addV("D").property(id, 2).as("d1").
  addV("D").property(id, 4).as("d2").
  addE("ContainsB").property(id, 6).property("order", 0).from("a").to("b1").
  addE("ContainsB").property(id, 7).property("order", 1).from("a").to("b2").
  addE("ContainsC").from("b1").to("c1").
  addE("ContainsC").from("b2").to("c2").
  addE("ContainsD").from("b1").to("d1").
  addE("ContainsD").from("b2").to("d2").iterate()

现在回答你的遍历问题(老实说,我不知道你为什么要尝试使用 project() 来解决问题):

outE("ContainsB") edges ( expected edges: [6,7] )

gremlin> g.V().outE("ContainsB").order().by("order").id().fold()
==>[6,7]

out("ContainsB").out("ContainsC") vertices ( expected vertices: [1,3] )

gremlin> g.V().outE("ContainsB").order().by("order").inV().
                out("ContainsC").id().fold()
==>[1,3]

out("ContainsB").out("ContainsD") vertices ( expected vertices: [2,4] )

gremlin> g.V().outE("ContainsB").order().by("order").inV().
                out("ContainsD").id().fold()
==>[2,4]