关于谓词的注意事项

PFunction<Object,Boolean>形式的谓词。也就是说,给定一些对象,返回true或false。所提供的谓词在下表中概述,并用于各种步骤,例如has()where()is()等。

Predicate Description
eq(object) Is the incoming object equal to the provided object?
neq(object) Is the incoming object not equal to the provided object?
lt(number) Is the incoming number less than the provided number?
lte(number) Is the incoming number less than or equal to the provided number?
gt(number) Is the incoming number greater than the provided number?
gte(number) Is the incoming number greater than or equal to the provided number?
inside(number,number) Is the incoming number greater than the first provided number and less than the second?
outside(number,number) Is the incoming number less than the first provided number or greater than the second?
between(number,number) Is the incoming number greater than or equal to the first provided number and less than the second?
within(objects…) Is the incoming object in the array of provided objects?
without(objects…) Is the incoming object not in the array of the provided objects?

除了表中的表达式外,还有比如not()test()等,如下:

gremlin> not(neq(2)) //1\
==>eq(2)
gremlin> not(within('a','b','c')).test('d') //2\
==>true
gremlin> not(within('a','b','c')).test('a')
==>false

Note

上述谓词表达式来自以下静态引入import static org.apache.tinkerpop.gremlin.process.traversal.P.*.

关于栅栏步骤的注意事项

Gremlin主要是一个懒惰的流处理语言。这意味着Gremlin在从遍历开始/头部获取更多数据之前,会尽其所能地完全处理当前在遍历管道中的任何遍历器。然而,在许多情况下,完全懒惰的计算是不可能的(或不切实际的)。当计算不是懒惰的时候,就存在一个“栅栏步骤”。有三种类型的障碍:

  • CollectingBarrierStep

    order(), sample(), aggregate(), barrier()等步骤。在步骤之前的所有遍历器被放入一个集合中,然后以某种方式(例如有序的)处理,然后将该集合一个一个地“流入(drained)”到下一个步骤。

  • ReducingBarrierStep

    fold(), count(), sum(), max(), min()等。在步骤之前的所有遍历器都被做“reduce”处理,并且一旦所有先前的遍历器被处理,一个单一的“reduced后的值(reduced value)”遍历器被发送到下一步。

  • SupplyingBarrierStep

    cap()。所有在这个步骤之前的遍历器被迭代(不处理),然后一些供应商(provided supplier)产生一个单一的遍历器来继续下一步。

在Gremlin OLAP中,在每个相邻顶点步骤的末尾可以引入一个栅栏。

关于范围的注意事项

范围枚举有两个常量:Scope.local和Scope.global。作用域决定作用域的特定步是与当前对象(本地)相关的,还是整个对象(全局)的整个对象流。

以下例子:

gremlin> g.V().has('name','marko').out('knows').count() //1\
==>2
gremlin> g.V().has('name','marko').out('knows').fold().count() //2\
==>1
gremlin> g.V().has('name','marko').out('knows').fold().count(local) //3\
==>2
gremlin> g.V().has('name','marko').out('knows').fold().count(global) //4\
==>1

解释上述例子:

1、Marko知道两个人。

2、Marko的朋友列表被创建,因此,一个对象被计数(即单个列表)。

3、Marko的朋友列表被创建,并且本地计数产生该列表中的对象的数量。

4、count(global)count()相同,因为大多数作用域步骤的默认行为是全局的。

  • 支持范围的步骤

    count()

    dedup()

    max()

    mean()

    min()

    order()

    range()

    limit()

    sample()

    tail()

Lambdas的注意事项

Gremlin支持Lambda表达式,但是并不推荐使用。以下使用Lambda表达式与不用Lambda表达式进行相同查询的语法比较:

gremlin> g.V().filter{it.get().value('name') == 'marko'}.
flatMap{it.get().vertices(OUT,'created')}.
map {it.get().value('name')} // 使用Lambda
==>lop
gremlin> g.V().has('name','marko').out('created').values('name') //不使用Lambda
==>lop

建议用户当且仅当所需功能只有lambda表达式时,才使用lambda表达式。原因是,lambda不能被Gremlin的编译策略优化,因为它们不能被程序检查(参见遍历策略)。

注意,目前(截止0.2.0版本)还不能在Gremlin-Server上执行远程发来的lambda,也没有支持远程执行的驱动程序。

TinkerPop中的遍历:图的遍历中谓词、栅栏、范围和Lambda的说明的更多相关文章

  1. iReport 中使用 Chart 图

    iReport 中使用 Chart 图 SSH2项目中需要引入如下两个jar包: jfreechart-1.0.12.jar jcommon-1.0.15.jar 从 iReport 的安装目录下搜索 ...

  2. TinkerPop中的遍历:图的遍历策略

    遍历策略 一个TraversalStrategy分析一个遍历,如果遍历符合它的标准,可以相应地改变它.遍历策略在编译时被执行,并构成Gremlin遍历机的编译器的基础.有五类策略分列如下: decor ...

  3. TinkerPop中的遍历:图的遍历步骤(3/3)

    48 Project Step project() 步骤(map)将当前对象投射到由提供的标签键入的Map<String,Object>中. gremlin> g.V().out(' ...

  4. TinkerPop中的遍历:图的遍历步骤(1/3)

    图遍历步骤(Graph Traversal Steps) 在最一般的层次上,Traversal<S,E>实现了Iterator,S代表起点,E代表结束.遍历由四个主要组成部分组成: Ste ...

  5. Java中关于HashMap的元素遍历的顺序问题

    Java中关于HashMap的元素遍历的顺序问题 今天在使用如下的方式遍历HashMap里面的元素时 1 for (Entry<String, String> entry : hashMa ...

  6. 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离

    数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...

  7. [LeetCode] Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树

    Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...

  8. Jquery中each的三种遍历方法

    Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(dat ...

  9. 关于js中的for(var in)遍历属性报错问题

    之前遇到过这个问题,但是没找到问题的所在,将for(var i in  array){} 改成了for(var i ;i<array.length;i++)循环,但是今天又遇到了,mark一下错 ...

  10. OC中几种集合的遍历方法(数组遍历,字典遍历,集合遍历)

    // 先分别初始化数组.字典和集合,然后分别用for循环.NSEnumerator枚举器和forin循环这三个方法来实现遍历 NSArray *array = @[@"yinhao" ...

随机推荐

  1. python与mongodb

    一.mongodb的原理介绍: 特点: 为了理解以上特点,我们从一个真实的场景出发,介绍mongodb的原理:参考视频:https://www.youtube.com/watch?v=4SxHNmk5 ...

  2. IP地址的基础划分

    1.基础知识 1.1  IP地址是由网络号(net ID)与主机号(host ID)两部分组成的. 1.2  IP地址的分类 IP地址长度为32位,点分十进制(dotted decimal)地址: 采 ...

  3. jacksi(比较实用的工具批处理)

    批处理类别: 国产软件 批处理语言: 简体中文 授权方式: 免费软件 运行环境: Windows平台 警告:运行BAT源码是一种危险的动作,如果你不熟悉,请不要尝试! 这里分享的是用bat写的比较实用 ...

  4. rabbitmq -- networking

    RabbitMQ大名鼎鼎, 其networking 部分经常被众多Erlang 程序员, 爱好者分析. 小的时候就见到很多人写过这方面的blog, 比如: 1, http://www.blogjava ...

  5. Gwt第三方组件、框架介绍

    介绍一下我接触过的Gwt第三方组件.框架及项目 1. Mygwt 曾经的大名鼎鼎的gwt第三方框架,在某些gwt框架的排名中排名第一.这个框架完全用gwt的方式实现了ext-js的功能,不依赖于ext ...

  6. rtsp/rtp over http

    转载:http://linux-expert.blog.163.com/blog/static/764585292008530912712/ rtsp/rtp over http C->S (g ...

  7. spring学习七

    一: web.xml中常用配置元素? <servlet></servlet>: 在向servlet或JSP页面制定初始化参数或定制URL时,首先命名servlet或JSP页面. ...

  8. #pragma pack 在BITMAP结构体定义中的使用

    BITMAP位图文件主要分为如下3个部分: 块名称 对应Windows结构体定义 大小(Byte) 文件信息头 BITMAPFILEHEADER 14 位图信息头 BITMAPINFOHEADER 4 ...

  9. 基于OpenCV的火焰检测(三)——HSI颜色判据

    上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据--HSI判据. 为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型: HSI颜 ...

  10. WebApi学习系列

      最近有一些时间,打算学习和整理一下Web API的一些学习资料的翻译工作.以下是对Web API 的大概目录的整理.欢迎更多的朋友一起加入到学习Web API 的队伍中来,如果你想贡献自己的,请联 ...