当前位置: 首页 > 面试题库 >

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

卓云
2023-03-14
问题内容

我有一个用例,其中我必须遍历从特定顶点开始的一连串顶点。它是一条线性链(如火车),只有一个顶点与前一个顶点相连。遍历时,我必须根据某些条件发出某些顶点,直到到达链的末端。

第二个用例是上述用例的扩展,但不是从单个顶点开始的单个链,而是有多个从单个顶点开始的链。我必须遍历每个链,并检查顶点中的特定属性值。找到该属性匹配项后,我必须发出该顶点并从第二条链开始,依此类推。

我必须使用Gremlin java API来实现。这似乎很简单,但是我是gremlin的新手,关于gremlin 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闭包,您知道在它下面只是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可以使事情变得非常整洁时确实不值得花费精力来生成或维护。



 类似资料:
  • Titan 是美图公司基于 TiKV 开发的一个 NoSQL 数据库,Titan 使用完全兼容 Redis 的通讯协议。 主要特性: 完全兼容 Redis 协议 完全支持强一致性的分布式事务 支持多租户模式 无缝扩展 高可用性 下面是 Titan 的一些性能测试结果: Get Set LPush LPop LRange

  • 本文向大家介绍JavaScript中的图遍历,包括了JavaScript中的图遍历的使用技巧和注意事项,需要的朋友参考一下 图遍历(也称为图搜索)是指访问(检查和/或更新)图中每个顶点的过程。此类遍历按访问顶点的顺序分类。

  • 项目简介:  TITAN网络引擎主要用于实时数据通讯,游戏服务端开发。其底层采用了高并发异步模型EPOLL(ET模式)设计开发,通过线程池、缓存池、对象池、异步日志库等组件提高其数据处理能力。同时为了降低开发者的开发难度,TITAN整合了Python脚本,开发者能够通过书写脚本完成事件的处理。同时由于TITAN的设计特性,改动处理逻辑后无需重新编译,只需重启服务即可完成所有更新。  目录说明: 

  • Titan 是一个分布式的图数据库,特别为存储和处理大规模图而优化。 支持不同的分布式存储层 Cassandra 1.1 HBase 0.92 内置实现 Blueprints graph API Gremlin graph traversal language Frames graph-to-object mapper Rexster graph server

  • 如果水平顺序遍历优于rest遍历,那么在二叉搜索树中学习它们有什么用呢? 与顺序遍历和前序遍历相比,级别顺序遍历似乎更容易获取信息。

  • 嘿,伙计们,我在让for循环工作时遇到了一些麻烦。myList是一个链表,其中填充了文件中的数字,我正在尝试遍历它并以一种(当前,下一个)的方式打印当前值和每个下一个值- 出于某种原因,for循环无法执行任何操作,或者更确切地说,代码在for循环的开始就中断了。如果我摆脱for循环并只是复制和粘贴 很多时候它会按照我的意愿工作,但我宁愿不这样做。for 循环语法看起来是正确的,如果 say cou