在java中使用gremlin获取两个节点之间的所有路径

Posted

技术标签:

【中文标题】在java中使用gremlin获取两个节点之间的所有路径【英文标题】:Fetching all the paths between two nodes using gremlin in java 【发布时间】:2015-05-13 10:29:46 【问题描述】:

嗨,我对 gremlin 有点陌生,并试图通过查找两个节点之间的所有路径来解决一些问题。在 gremlin 控制台上的简单查询中,我可以使用此查询来做到这一点:

(Name of the first Node).loop(1)it.loops<100true.has('name', (Name of the second node)).pathit.name

但是当我试图从 java 方法中获取它时,我遇到了很多问题,比如:

-- 不知道将查询准确放在哪里? -- 什么样的数据结构适合接收行数组。 -- 如何从图中收集第一个节点和第二个节点。

这里我尝试过继续,但没有任何线索:

  Graph g = new OrientGraph(AppConstants.GRAPH_LOCATION);
         List<String> vertexList = new ArrayList<String>();
         try
             for (Vertex v : g.getVertices()) 
                    String vertexName = v.getProperty("name");
                    vertexList.add(vertexName);
                    
             return vertexList;
          catch (final Exception ex) 
             throw new AppSystemException(ex);
         finally
             g.shutdown();

谢谢, 萨吉尔

【问题讨论】:

【参考方案1】:

您的查询对我来说没有多大意义,但描述有所帮助。下面是一个示例,使用 TinkerGraph 查找 markolop 之间的所有路径:

final Graph g = TinkerGraphFactory.createTinkerGraph();
List<List> names = new ArrayList<>();
new GremlinPipeline<Vertex, ArrayList<Vertex>>(g).V().has("name", "marko").as("x").out().loop("x",
        new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() 
            @Override
            public Boolean compute(LoopPipe.LoopBundle<Vertex> loopBundle) 
                return loopBundle.getLoops() < 100;
            
        , new PipeFunction<LoopPipe.LoopBundle<Vertex>, Boolean>() 
            @Override
            public Boolean compute(LoopPipe.LoopBundle<Vertex> loopBundle) 
                return "lop".equals(loopBundle.getObject().getProperty("name"));
            
        
).has("name", "lop").path(new PipeFunction<Vertex, String>() 
    @Override
    public String compute(final Vertex vertex) 
        return vertex.getProperty("name");
    
).fill(names);

names 列表随后将填充以下 2 个条目:

    [marko, lop] [马克,乔希,洛普]

如果将 Groovy 转换为 Java 是最大的问题,您绝对应该检查一下:Converting Gremlin Groovy to Gremlin Java

【讨论】:

至于“你的查询去哪里”和“如何收集数据”——你在控制台中的“查询”实际上只是一个Iterator——在你的java中简单地对待它代码。您还可以创建一个基于 groovy 的库,其中包含图形遍历。然后从您的 java 库中引用它。或者只是让你的 groovy 图遍历与你的 .groovy 文件共存于 .java 文件中。混合项目很容易。 你能说明一下 as("x") 和 .out() 和 .loop("x" ... 的值是多少??我的意思是 x = ? x 是循环遍历开始的顶点。在我的第二条路径示例中,第一个循环中的marko 和第二个循环中的josh。它与.loop(1)基本相同,但它使用了一个命名步骤而不是多个步骤。 您好丹尼尔,回复非常有帮助。但是对于具有超过 10k 个节点的图形数据库,我所面临的问题不适用于此循环。您能否在没有循环的情况下参考类似的查询...对吗? g.v(100).out.loop(1) it.object != g.v(200) .path ? 存在“marko”和“lop”被两个字符串变量替换的问题。它正在返回空白数组!

以上是关于在java中使用gremlin获取两个节点之间的所有路径的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gremlin 在两个顶点之间创建双向边?

如何使用 Gremlin/Titan/TinkerPop3 更新特定的边缘属性?

如果 gremlin 中存在边,则获取布尔值

如何从顶点scala gremlin获取所有传入/传出边的所有顶点

如何在单个 gremlin 查询中将两个顶点详细信息和边属性详细信息合并在一起

在 datastax 图中使用 gremlin 访问 Solr 的最佳方法