我有以下图表:
创建使用:
Vertex p1 = g.addV("Person")
.property(T.id, "1")
.next();
Vertex p2 = g.addV("Person")
.property(T.id, "2")
.next();
Vertex p3 = g.addV("Person")
.property(T.id, "3")
.next();
Vertex p4 = g.addV("Person")
.property(T.id, "4")
.next();
Vertex p5 = g.addV("Person")
.property(T.id, "5")
.next();
Vertex p6 = g.addV("Person")
.property(T.id, "6")
.next();
Vertex p7 = g.addV("Person")
.property(T.id, "7")
.next();
g.addE("TalksTo").from(p1).to(p2)
.property(T.id, "a")
.next();
g.addE("TalksTo").from(p2).to(p3)
.property(T.id, "b")
.next();
g.addE("TalksTo").from(p3).to(p2)
.property(T.id, "c")
.next();
g.addE("TalksTo").from(p2).to(p4)
.property(T.id, "d")
.next();
g.addE("TalksTo").from(p4).to(p5)
.property(T.id, "e")
.next();
g.addE("TalksTo").from(p5).to(p7)
.property(T.id, "f")
.next();
g.addE("TalksTo").from(p6).to(p5)
.property(T.id, "g")
.next();
g.addE("TalksTo").from(p3).to(p6)
.property(T.id, "h")
.next();
我想遍历该图以获得以下路径:
7 -> 5 -> 4 -> 2 -> 1
7 -> 5 -> 6 -> 3 -> 2 -> 1
从本质上打破了 2 和 1 之间的循环。
我尝试过以下查询:
g.V("7")
.repeat(
as("source").inE("TalksTo").outV().where(neq("source"))
)
.until(or(
inE().hasLabel("TalksTo").count().is(0),
loops().is(10),
cyclicPath()
))
.path()
.toList();
但它没有产生我正在寻找的结果 - 我是否需要考虑子图来解决这个问题?
您想使用
simplePath()
过滤器。
......1> repeat(inE('TalksTo').outV().simplePath()).
......2> until(
......3> or(
......4> inE().hasLabel("TalksTo").count().is(0),
......5> loops().is(10))).
......6> path().by(T.id)
==>[7,f,5,e,4,d,2,a,1]
==>[7,f,5,g,6,h,3,b,2,a,1]
要获取问题中发布的确切路径,您可以直接跳到顶点,而不是先获取边,然后获取顶点:
......1> repeat(in('TalksTo').simplePath()).
......2> until(
......3> or(
......4> inE().hasLabel("TalksTo").count().is(0),
......5> loops().is(10))).
......6> path().by(T.id)
==>[7,5,4,2,1]
==>[7,5,6,3,2,1]