将Gremlin Groovy转换为Gremlin Java应该不是很困难。我会一直反对这样做,因为您会:
- 大大增加代码的大小
- 降低代码的可读性
- 使您的代码难以维护
如果您是在“
Java商店”工作,而不会听说外部编程语言,那么我认为,仅凭几个Gremlin在groovy和java中的差异示例,就可以很容易地向这些人推销产品。阅读一个衬纸与可能的数百行代码)。此外,Groovy可以与Java在同一模块中,也可以在其他项目所依赖的独立模块中,与标准Maven项目一起使用。在大多数情况下,我更喜欢后者,因为您可以将常规应用程序隔离在一个软件包中,并且可以在多个用例(例如,应用程序,gremlin控制台中的附加库等)中作为DSL重用。
就是说,如果您仍然必须使用Java,我仍然会从编写Groovy开始。使用Gremlin
Console并正确执行遍历算法。听起来好像您的两个用例都涉及循环,所以我们只能说您的遍历看起来像:
g.v(1).out.loop(1){true}{it.object.someProperty=="emitIfThis"}
这样,它将从顶点“ 1”开始遍历该链,直到我用尽了该链(在第一个闭合中以“
true”表示),然后在第二个闭合中发出了与我的标准匹配的任何顶点。一旦定义并测试了Gremlin的大部分内容,就该转换为Java了。
如您所知,以a开头,
GremlinPipeline对于转换而言,第一部分非常容易:
new GremlinPipeline(g.getVertex(1)).out()
如您所见,Groovy方法将相当干净地映射到Java,直到达到需要关闭的地步为止
loop,这是需要一个步骤的步骤之一。要使用Gremlin
Java,可能会发现对Javadoc进行查看很有用
GremlinPipeline。
我使用了三个参数的版本
loop-一个标记为“已弃用”(但这对于我们而言是可以的)-您可以在这里看到它。第一个参数很简单-
一个整数,所以翻译的第一部分是:
new GremlinPipeline(g.getVertex(1)).out().loop(1, closure, closure)
我为其他两个闭包留了占位符。如果您这样看,它实际上与我们的Groovy版本没有什么不同-语法略有不同。
在Java
8之前,没有在Java语言中内置闭包的概念。请注意,在TinkerPop3中,Gremlin发生了巨大变化,以利用我们现在拥有lambda的事实。但是,就像在TinkerPop2中一样,您必须使用build,
PipeFunction它本质上代表了Groovy闭包的类型化版本。该
PipeFunction两个参数循环是:
PipeFunction<LoopPipe.LoopBundle<E>,Boolean>
因此,从根本上讲,这是一个
LoopPipe.LoopBundle以对象作为对象的函数,该对象包含有关循环的元数据,并期望您返回布尔值。如果您理解了这个概念,那么所有Gremlin
Java都会为您打开,因为在任何地方都可以看到groovy闭包,您知道在它下面只是
PipeFunctionJava中的某种形式,并且您现在可以从中读取a的期望了
PipeFunction。
javadocs,进行这些语言翻译应该很简单。
我们要做的第一个闭包翻译非常简单-我们只需要
PipeFunction返回即可
true:
new GremlinPipeline(g.getVertex(1)).out().loop(1, new PipeFunction<LoopPipe.LoopBundle<Vertex>,Boolean>() { public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { return true; } }, closure)
因此,对于第二个参数,
loop我们必须构造一个new
PipeFunction,它具有一个称为的方法
compute。从那个方法我们返回
true。现在来处理
PipeFunction控制顶点发射的第二个参数:
new GremlinPipeline(g.getVertex(1)).out().loop(1, new PipeFunction<LoopPipe.LoopBundle<Vertex>,Boolean>() { public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { return true; } }, new PipeFunction<LoopPipe.LoopBundle<Vertex>,Boolean>() { public Boolean compute(LoopPipe.LoopBundle<Vertex> argument) { return argument.getObject().getProperty("someProperty").equals("emitIfThis"); } })
那里有转换。由于这是一篇很长的文章,所以让我们将原始的常规设置放置在靠近上述位置的地方,以使区别显而易见:
g.v(1).out.loop(1){true}{it.object.someProperty=="emitIfThis"}
我们从上面的代码行转到几乎一整遍,而这本来是非常简单的遍历。鉴于lambda和语言本身的重大改进,Gremlin
Java在TinkerPop3中得到了自己的应用,但是这些以前的版本产生的Java代码在Groovy可以使事情变得非常整洁时确实不值得花费精力来生成或维护。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)