Java 如何使用有序边从顶点进行遍历,并在两步之外保持有序

Java 如何使用有序边从顶点进行遍历,并在两步之外保持有序,java,gremlin,Java,Gremlin,我有一个图表示例: 我试图用以下内容填充有序列表: outE(“ContainsB”)边缘(预期边缘:[6,7]) out(“ContainsB”).out(“ContainsC”)顶点(预期顶点:[1,3]) out(“ContainsB”).out(“ContainsD”)顶点(预期顶点:[2,4]) 从ContainsB的order属性保持排序 以下是我到目前为止没有订购的产品: Map<String, Object> map = g.V(a.id())

我有一个图表示例:

我试图用以下内容填充有序列表:

  • outE(“ContainsB”)
    边缘(预期边缘:
    [6,7]
  • out(“ContainsB”).out(“ContainsC”)
    顶点(预期顶点:
    [1,3]
  • out(“ContainsB”).out(“ContainsD”)
    顶点(预期顶点:
    [2,4]
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();

稍后我会:

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");
vertexa=(Vertex)map.get(“a”);
List containsBEdges=(List)map.get(“containsBEdges”);
List cVertices=(List)map.get(“cVertices”);
列表广告=(列表)map.get(“广告”);
根据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”)
边缘(预期边缘:
[6,7]

out(“ContainsB”).out(“ContainsC”)
顶点(预期顶点:
[1,3]

out(“ContainsB”).out(“ContainsD”)
顶点(预期顶点:
[2,4]


让我们从一个脚本开始创建图形,以便其他人可以跟随:

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”)
边缘(预期边缘:
[6,7]

out(“ContainsB”).out(“ContainsC”)
顶点(预期顶点:
[1,3]

out(“ContainsB”).out(“ContainsD”)
顶点(预期顶点:
[2,4]


我需要使用project(从您对我的一个老问题的回答中),因为我在一次遍历中完成所有操作,并且我需要以某种方式同时获得所有这些部分。。因此,我不必担心
order()
之后的任何内容都会以错误的顺序返回,对吗?当然,使用
order()
您会得到元素的保证顺序。但是,如果您要从
B
顶点(例如
out(“ContainsC”,“ContainsD”)
)遍历两条边,那么
C
D
的顺序就不能保证了。这是有道理的!但是一条边向外将保持正确的顺序?对project()有什么反建议吗?所以我在我的帖子里写的东西一定能用??我需要使用project(从你对我一个老问题的回答中),因为我在一次遍历中完成所有事情,我需要以某种方式一次获得所有这些部分。所以我不必担心
order()之后的任何事情
将以错误的顺序返回,对吗?使用
order()
您当然会得到元素的保证顺序。但是,如果您要从
B
顶点(例如
out(“ContainsC”、“ContainsD”)遍历两条边
C
D
的顺序不会/无法保证。有道理!尽管有一个边缘将保持正确的顺序?对project()有任何反建议吗?所以我在我的帖子中写的东西保证有效??
gremlin> g.V().outE("ContainsB").order().by("order").id().fold()
==>[6,7]
gremlin> g.V().outE("ContainsB").order().by("order").inV().
                out("ContainsC").id().fold()
==>[1,3]
gremlin> g.V().outE("ContainsB").order().by("order").inV().
                out("ContainsD").id().fold()
==>[2,4]