为什么在Java中解析Gremlin查询不是通用的?

时间:2015-06-14 07:52:57

标签: java gremlin

我正在使用Java解析Gremlin查询(实际上,我正在编写Scala,并使用Groovy编译的JAR,就像Java一样)。

查询是一个由用户输入给出的String变量。换句话说 - 我不知道查询将是什么,我只是假设它是一个有效的Gremlin查询(在语法和逻辑上)。

我从一个简单的Gremlin.compile(query)开始,返回Pipe,我正在迭代。但是,根据the example,必须在迭代管道之前调用.setStarts。我必须知道S中的运行时类型Pipe<S,E>是什么。

感觉这个API不够通用,来自示例的以下行

pipe.setStarts(new SingleIterator<Vertex>(graph.getVertex(1)));

适用于某些情况,但对于一个示例(g.V())的Vertex迭代,它将抛出CastException。

有办法解决它吗?

也许使用底层脚本引擎(如上面链接中的下一个示例)将帮助我实现更通用的代码?

1 个答案:

答案 0 :(得分:1)

我找到了解决方法。感觉有点难看,但它确实起作用。

  1. 我使用ScriptEnginebindings的&#39; g&#39;对于图表,用户可以使用g.启动他/她的查询。 (对于泛型有帮助,但是通过不让用户在他/她的查询开始时使用身份管道(_())来使其更加用户友好。

  2. (有点难看,我知道)我从查询字符串中提取(使用RegEx)起始顶点(如果存在),以编程方式找到它(如果找到)用它调用setStarts。如果没有找到,我将图表本身作为setStarts的参数,假设它是一个顶点迭代查询。