根据Edge属性对路径进行排序

时间:2019-07-29 08:15:43

标签: gremlin tinkerpop

基于Edge属性和Dedup对遍历路径进行排序

你好, 我有一个内存中图,我想基于Edge属性对路径进行排序,还想对路径指向相同目的地的dedup进行排序。

例如

    String NAME = "name";
   String id = "id";
    g.addV().property(id, 1).property(NAME, "u1").as("u1")
            .addV().property(id, 2).property(NAME, "u2").as("u2")
            .addV().property(id, 3).property(NAME, "u3").as("u3")
            .addV().property(id, 4).property(NAME, "u4").as("u4")
            .addE(rel).from("u2").to("u1").property("order", 2)
            .addE(rel).from("u3").to("u1").property("order", 1)
            .addE(rel).from("u4").to("u2").property("order", 3)
            .addE(rel).from("u4").to("u3").property("order", 4)
            .iterate();

我想要实现的是遍历,它只给我一条路径,即

顶点= [path [u1,u3,u4]]。

我尝试使用下面的gremlin。

    List<Path> maps = g.V()
                .has("id", 1)
                .repeat(in()
                        .simplePath())
                .until(inE().count().is(0))
                .order().by(outE("rel").values("order"),Order.asc)
                .path().by("name")
                .toList();

但是排序不会发生。它给了我两条路径: 顶点= [路径[u1,u2,u4],路径[u1,u3,u4]]

但是我正在寻找输出为 vertices = [path [u1,u3,u4]]

我是gremlin的新手,没有其他选择可以尝试。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

使用toList将为您提供所有可遍历的遍历。在您的情况下,您确实订购了答案,但并没有只回答第一个。

您应该添加limit步骤:

...
.limit(1).toList()

或者您可以使用next()代替toList()

答案 1 :(得分:1)

g.V() 
.has("id", 1) 
.repeat(in("rel") .order() .by(outE().values("order"), Order.asc) .simplePath() )
.until(inE().count().is(0)) 
.dedup() 
.path() 
.by("name") 
.toList() ;