我有一个用例,其中我必须遍历从特定顶点开始的一连串顶点。它是一条线性链(如火车),只有一个顶点与前一个顶点相连。遍历时,我必须根据某些条件发出某些顶点,直到到达链的末端。
第二个用例是上述用例的扩展,但不是从单个顶点开始的单个链,而是有多个从单个顶点开始的链。我必须遍历每个链,并检查顶点中的特定属性值。找到该属性匹配项后,我必须发出该顶点并从第二条链开始,依此类推。
我必须使用Gremlin java API来实现。这似乎很简单,但是我是gremlin的新手,关于gremlin java API的互联网也没有太多帮助。
将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闭包,您知道在它下面只是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可以使事情变得非常整洁时确实不值得花费精力来生成或维护。
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