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

时间:2015-04-20 10:19:57

标签: graph-databases gremlin

我需要遍历路径,并且将根据路径的某些中间顶点中的数据来选择特定路径。

我在GremlinPipeLine中遇到了store()函数来将数据存储在列表中,或者可以使用groupBy函数将数据存储在map中。但我的问题是如何在遍历的后面部分使用存储的数据,其中确切的路径需要根据这些数据找出答案。

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

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

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

在上面的示例中,节点B具有属性(Route),类似地,节点F和L具有属性(Route),因此当遍历器位于节点E时,根据节点B的属性(Route)确定下一个节点,即选择具有相同路线编号的一个(F或L)。

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

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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我的描述并不完全清楚。也许你可以包含一个小样本图。不过可能有以下帮助:

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

这个想法是你只是filter遍历遍历的分支,这些分支不同意route A的第一个邻居的B属性route。请注意,如果A有多个邻居,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]

我得到{{1}}

答案 1 :(得分:0)

使用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();
    }
}