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]