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

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

(Name of the first Node).loop(1){it.loops<100}{true}.has('name', (Name of the second node)).path{it.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();

谢谢, 萨吉尔

【问题讨论】:

    标签: java graph-databases orientdb gremlin tinkerpop


    【解决方案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 个条目:

    1. [marko, lop]
    2. [马克,乔希,洛普]

    如果将 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”被两个字符串变量替换的问题。它正在返回空白数组!
    猜你喜欢
    • 2023-01-15
    • 2019-04-23
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多