第22期 Gremlin Steps:
hasNext()
、next()
、tryNext()
、toList()
、toSet()
、toBulkSet()
、fill()
、iterate()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据。
说明
Gremlin 中有一类特殊的操作,它能够终止遍历器的“遍历”行为,使其执行并返回结果。在这里要强调的一点:原生的 Gremlin 语句通常都是用遍历器连接起来的,但其实这些连接的过程并不会执行 Gremlin 语句,只有走到了terminal
Step 时才会执行。这个模式类似于 Spark 中对RDD
的map
和action
操作。
hasNext
: 判断遍历器是否含有元素(结果),返回布尔值;next
: 不传参数时获取遍历器的下一个元素,也可以传入一个整数 n,则获取后面 n 个元素;tryNext
:hasNext
和next
的结合版,返回一个Optional
对象,如果有结果还需要调用get()
方法才能拿到;toList
: 将所有的元素放到一个List
中返回;toSet
: 将所有的元素放到一个Set
中返回,会去除重复元素;toBulkSet
: 将所有的元素放到一个能排序的List
中返回,重复元素也会保留;fill
: 传入一个集合对象,将所有的元素放入该集合并返回,其实toList
、toSet
和toBulkSet
就是通过fill
Step实现的;iterate
: 这个 Step 在终止操作里面有点特殊,它并不完全符合终止操作的定义。它会在内部迭代完整个遍历器但是不返回结果。
那肯定有细心的同学要问了,前面我们介绍了那么多的 Step 很多都没有加terminal
Step 啊,为什么也能返回结果呢?其实这是 Tinkerpop 的 Gremlin 解析引擎对遍历器对象调用了一个IteratorUtils.asList()
方法,又调用了它内部的fill()
方法(注意:不是上面讲到的fill()
Step)。
实例讲解
下面通过实例来深入理解每一个操作。
-
Step
hasNext()
示例1:
// 判断顶点“linary”是否包含“created”出顶点 g.V('linary').out('created').hasNext()
示例2:
// 判断顶点“linary”是否包含“knows”出顶点 g.V('linary').out('knows').hasNext