Neptune Gremlin 在收集路径时如何打破循环

问题描述 投票:0回答:1

我有以下图表:

enter image description here

创建使用:

    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();

但它没有产生我正在寻找的结果 - 我是否需要考虑子图来解决这个问题?

gremlin tinkerpop amazon-neptune
1个回答
0
投票

您想使用

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]
© www.soinside.com 2019 - 2024. All rights reserved.