在遍历图形时在 gremlin java 中存储和检索数据

Storing data and retrieving it in gremlin java while traversing the graph

我需要遍历一条路径,特定路径的选择将根据路径的某个中间顶点的数据完成。

我在 GremlinPipeLine 中遇到了 store() 函数,可以将数据存储在列表中,或者可以使用 groupBy 将数据存储在地图中 function.But 我的问题是如何在遍历的后期使用存储的数据具体路径需要根据这个数据找出来。

A->B->C->D->E

                  *-> F -> G ->I -> J*

                   *-> L -> M-> N -> O*

在上面的例子中,节点B有一个属性(路线),类似地节点F和L有属性(路线)所以当遍历器在节点E时,下一个节点是根据在节点 B 的 属性(Route) 上,即选择具有相同路由号的那个(F 或 L)。

那么我们如何使用 GremlinPipeLine 做到这一点。

已尝试使用过滤器和 PipeLineFunction 在 E 点使用固定的 "Route",但无法在 E 点使用 B 的 'Route' 值。

任何帮助将不胜感激。

你的描述对我来说不是很清楚。也许你可以包括一个小样本图。然而,也许以下帮助:

route = null; g.v('A').out.sideEffect{route = it.route}.out.out.out.out.filter{it.route == route}.out.out.out

这个想法是,您只需 filter 出不同意 A 第一个邻居的 route 属性 的遍历分支,即B。请记住,如果 A 有多个邻居,route 将被分配多次。

以下面的例子

g = new TinkerGraph()

ids = ['A','B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O']
ids.each{g.addVertex(it)}

g.addEdge(g.v('A'), g.v('B'), 'x')
g.addEdge(g.v('B'), g.v('C'), 'x')
g.addEdge(g.v('C'), g.v('D'), 'x')
g.addEdge(g.v('D'), g.v('E'), 'x')

g.addEdge(g.v('E'), g.v('F'), 'x')
g.addEdge(g.v('F'), g.v('G'), 'x')
g.addEdge(g.v('G'), g.v('I'), 'x')
g.addEdge(g.v('I'), g.v('J'), 'x')

g.addEdge(g.v('E'), g.v('L'), 'x')
g.addEdge(g.v('L'), g.v('M'), 'x')
g.addEdge(g.v('M'), g.v('N'), 'x')
g.addEdge(g.v('N'), g.v('O'), 'x')

g.v('B').route = 1
g.v('F').route = 0
g.v('L').route = 1

我得到v[O]

使用 GremlinPipeline 响应:

public Graph createGraph()
{
    Graph g = TinkerGraphFactory.createTinkerGraph();
    String [] ids ={"A","B","C","D","E","F","G","H","I","J","L","M","N","O"};
    int i= 0;
    for (String s:ids)
    {
        Vertex v = g.addVertex(s);
        i++;
        v.setProperty("route",i);
    }
    g.getVertex("L").setProperty("route",2); // If you want "F" as the next vertex from E then mark the route of "F" as 2.
    g.addEdge(1,g.getVertex("A"),g.getVertex("B"),"x") ;
    g.addEdge(2,g.getVertex("B"),g.getVertex("C"),"x") ;
    g.addEdge(3,g.getVertex("C"),g.getVertex("D"),"x") ;
    g.addEdge(4,g.getVertex("D"),g.getVertex("E"),"x") ;
    g.addEdge(5,g.getVertex("E"),g.getVertex("F"),"x") ;
    g.addEdge(6,g.getVertex("F"),g.getVertex("G"),"x") ;
    g.addEdge(17,g.getVertex("G"),g.getVertex("I"),"x") ;
    g.addEdge(18,g.getVertex("I"),g.getVertex("J"),"x") ;
    g.addEdge(19,g.getVertex("E"),g.getVertex("L"),"x") ;
    g.addEdge(20,g.getVertex("L"),g.getVertex("M"),"x") ;
    g.addEdge(21,g.getVertex("M"),g.getVertex("N"),"x") ;
    g.addEdge(22,g.getVertex("N"),g.getVertex("O"),"x") ;

    return  g;
}

public void traverse(Graph graph)
{
    final Map<String,Object> cache = new HashMap<String, Object>();
    final String attribute="route";
    GremlinPipeline pipes = new GremlinPipeline(graph.getVertex("A")).out().sideEffect(new PipeFunction<Vertex,Vertex>() {

        public Vertex compute(Vertex vertex)
        {
            cache.put(attribute,vertex.<Object>getProperty(attribute));
            return vertex;
        }
    }).out().out().out().out().filter(new PipeFunction<Vertex,Boolean>() {
        public Boolean compute(Vertex vertex)
        {
            if (vertex.getProperty(attribute) == cache.get(attribute))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }).out().out().out().path();

    while(pipes.hasNext())
    {
        ArrayList<Vertex> vertices = (ArrayList<Vertex>)pipes.next();
        for (Vertex v : vertices)
        {
            System.out.print("->"+v.getId());
        }
        System.out.println();
    }
}