【问题标题】:Gremlin Groovy Java Finding shortest Path + basic connectivityGremlin Groovy Java 寻找最短路径 + 基本连接
【发布时间】:2014-07-13 16:10:36
【问题描述】:

我有一个 java 应用程序,我从中调用一个 groovy 类来计算图中 2 个顶点之间的最短路径。

Java:

public class Test {
   public static void main(String[] args) {
      TinkerGraph g = new TinkerGraph();
      Vertex src = null;
      src = g.addVertex(null);
      src.setProperty("name",1); 
      src.setProperty("Type", "switch");
      Vertex src1 = null;
      src1 = g.addVertex(null);
      src1.setProperty("name",2);
      src1.setProperty("Type", "switch");
      Vertex src2 = null;
      src2 = g.addVertex(null);
      src2.setProperty("name",3);
      src2.setProperty("Type", "switch");
      Vertex src3 = null;
      src3 = g.addVertex(null);
      src3.setProperty("name",4);
      src3.setProperty("Type", "switch");
      Edge e=null;
      e=g.addEdge(null, src, src1, "connects");
      Edge e1=null;
      e1= g.addEdge(null, src1, src2, "connects");
      Edge e2=null;
      e2= g.addEdge(null, src2, src3, "connects");
      System.out.println(GetRoute.getPathToHost(g));
   }
}

时髦:

class GetRoute {
   static {
      Gremlin.load()
   }
   public static Map<Vertex, Integer> getPathToHost(TinkerGraph g) {
      g1.V[["name":1]].both.loop(2){!it.object.equals("name":4)}.Paths >> 1
   }
}

我的问题是:

  1. 首先查询是错误的。我已经在 gremlinpipe+java 中计算了一个函数,但它非常庞大,我正在尝试用 groovy 找到一种更简单的方法。如何优化此查询?

  2. 假设我的查询打印了 2 个顶点之间路径中的所有顶点,那么如何将其存储在一个 Map 数组中,或者如何将其打印到控制台上?

任何帮助将不胜感激。

问候

【问题讨论】:

  • 我认为你想要循环(1)。 loop(2) 一遍又一遍地带你回到起点。

标签: java groovy gremlin tinkerpop


【解决方案1】:

这是我的 Gremlin 会话:

gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> src = g.addVertex(null)
==>v[0]
gremlin> src.setProperty("name",1) 
==>null
gremlin> src.setProperty("Type", "switch")
==>null
gremlin> src1 = g.addVertex(null)
==>v[1]
gremlin> src1.setProperty("name",2)
==>null
gremlin> src1.setProperty("Type", "switch")
==>null
gremlin> src2 = g.addVertex(null)
==>v[2]
gremlin> src2.setProperty("name",3)
==>null
gremlin> src2.setProperty("Type", "switch")
==>null
gremlin> src3 = g.addVertex(null)
==>v[3]
gremlin> src3.setProperty("name",4)
==>null
gremlin> src3.setProperty("Type", "switch")
==>null
gremlin> e=g.addEdge(null, src, src1, "connects")
==>e[4][0-connects->1]
gremlin> e1= g.addEdge(null, src1, src2, "connects")
==>e[5][1-connects->2]
gremlin> e2= g.addEdge(null, src2, src3, "connects")
==>e[6][2-connects->3]
gremlin> g.V.has('name',1).out.loop(1){it.object.name != 4 && it.loops < 5}{true}.path.filter{it.last().name == 4}
==>[v[0], v[1], v[2], v[3]]

最后一行计算 1 和 4 之间的路径。您可以在 gremlindocs 中阅读有关使用 Gremlin 计算最短路径的更多信息:http://gremlindocs.com/#recipes/shortest-path(请原谅格式...一些 dns 问题困扰着 atm)

我不确定你会如何想要你要求的Map。 List 格式对我来说似乎很适合路径,但我想如果你希望它在路径中的第一个顶点上键入,我想你可以发出另一个转换:

gremlin> g.V.has('name',1).out.loop(1){it.object.name != 4 && it.loops < 5}{true}.path.filter{it.last().name == 4}.transform{[(it.first()):it]}
==>{v[0]=[v[0], v[1], v[2], v[3]]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2013-04-03
    • 2021-07-05
    • 2012-10-24
    • 1970-01-01
    • 2016-07-30
    • 2012-04-08
    相关资源
    最近更新 更多