我正在使用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。
有办法解决它吗?
也许使用底层脚本引擎(如上面链接中的下一个示例)将帮助我实现更通用的代码?
答案 0 :(得分:1)
我找到了解决方法。感觉有点难看,但它确实起作用。
我使用ScriptEngine
与bindings
的&#39; g&#39;对于图表,用户可以使用g.
启动他/她的查询。 (对于泛型有帮助,但是通过不让用户在他/她的查询开始时使用身份管道(_()
)来使其更加用户友好。
(有点难看,我知道)我从查询字符串中提取(使用RegEx)起始顶点(如果存在),以编程方式找到它(如果找到)用它调用setStarts。如果没有找到,我将图表本身作为setStarts的参数,假设它是一个顶点迭代查询。