关于谓词的注意事项

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. C++中预定义的宏

    以下信息摘自与标准C++的文档中. 如果把这些宏加在程序的日志中,它将为开发人员进行问题分析提供了很好的帮助. standard c++ 1998版The following macro names ...

  2. Hat’s Words(字典树的运用)

    个人心得:通过这道题,对于树的运用又加深了一点,字典树有着他独特的特点,那个指针的一直转换着实让我好生想半天, 不得不佩服这些发明算法人的大脑. 这题的解决方法还是从网上找到的,还好算法是自己实现得, ...

  3. C#获取路由器外网IP,MAC地址

    C#实现的获取路由器MAC地址,路由器外网地址.对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码.至于获取路由器的外网IP地址,可以不需要知道路由器web管理系统的用户名和密 ...

  4. 应用层-day01

    主流应用程序体系结构:CS结构.P2P结构. CS结构:客户-服务器体系结构.有一台总是打开的主机称为服务器,它服务来自其他许多称为客户的主机的请求. P2P体系结构:应用程序在不同的主机间链接,被称 ...

  5. ConcurrentHashMap的扩容机制(jdk1.8)

    ConcurrentHashMap相关的文章网上有很多,而关于ConcurrentHashMap扩容机制是很关键的点,尤其是在并发的情况下实现数组的扩容的问题经常会碰到,看到这篇写的具有代表性,详细讲 ...

  6. case编写的httpd简单启停脚本

    case编写的httpd简单启停脚本 #!/bin/bash HTTPD="/etc/init.d/httpd" . /etc/init.d/functions case &quo ...

  7. Python numpy函数:transpose()

    transpose用于对高维数组进行转置,转置时候需要一个由轴编号组成的元组. 比如说三维的数组,那就对维度进行编号,也就是0,1,2:这样说可能比较抽象.这里的0,1,2可以理解为对shape返回元 ...

  8. Nginx解决错误413 Request Entity Too Large

    最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报 ...

  9. hihoCoder#1050(树中最长路)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一 ...

  10. [转载]Linux内核list_head学习(二)

    前一篇文章讨论了list_head 结构的基本结构和实现原理,本文主要介绍一下实例代码. 自己如果想在应用程序中使用list_head 的相应操作(当然应该没人使用了,C++ STL提供了list 用 ...