【问题标题】:Storing data and retrieving it in gremlin java while traversing the graph在遍历图形时在 gremlin java 中存储和检索数据
【发布时间】:2015-04-20 10:19:56
【问题描述】:

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

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

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

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

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

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

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

已尝试使用过滤器和 PipeLineFunction 在 E 点使用固定“路线”,但无法在 E 处使用 B 的“路线”值。

任何帮助将不胜感激。

【问题讨论】:

    标签: graph-databases gremlin


    【解决方案1】:

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

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

    这个想法是你只需filter 出遍历不同意A 的第一个邻居Broute 属性的分支。请记住,如果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]

    【讨论】:

    • 谢谢Faber...你说得对...这对我帮助很大...也会用Java编辑您的回复,因为缺少Gremlin Java示例..可能会有所帮助某人..
    • 我建议您在单独的答案中添加 Java 管道示例。我不想接受你的补充,因为我不知道它们是否正确。对管道了解不多。 ……别忘了接受我的回答;)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多