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

时间:2017-01-06 01:43:08

标签: java gremlin

我有这个图表示例:

enter image description here

我要做的是使用以下命令填充有序列表:

  • outE("ContainsB")边(预期边缘:[6,7]
  • out("ContainsB").out("ContainsC")个顶点(预期顶点:[1,3]
  • out("ContainsB").out("ContainsD")个顶点(预期顶点:[2,4]

保持order

ContainsB属性的排序

到目前为止,这是我没有任何订购的内容:

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()所以我想知道如何遍历有序路径,这些路径以一组明确的有序边开始,并确保事情将会继续使用下一个版本。

谢谢!

1 个答案:

答案 0 :(得分: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]

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

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

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

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

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