Titan图用例中的GremlinPipeLine Java API链遍历

Titan图用例中的GremlinPipeLine Java API链遍历,第1张

Titan图用例中的GremlinPipeLine Java API链遍历

将Gremlin Groovy转换为Gremlin Java应该不是很困难。我会一直反对这样做,因为您会:

  1. 大大增加代码的大小
  2. 降低代码的可读性
  3. 使您的代码难以维护

如果您是在“
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闭包,您知道在它下面只是
PipeFunction
Java中的某种形式,并且您现在可以从中读取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可以使事情变得非常整洁时确实不值得花费精力来生成或维护。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5601074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存