gremlin语言介绍一:前言
1 gremlin与TinkerPop的关系
TinkerPop
是一个开源图计算框架(Graph Computing Framework
),它主要提供图计算(graph computing
)领域一些通用接口和工具。在TinkerPop
中,graph computing
由graph structure
和graph process
组成。graph structure
也称作graph
,graph process
也称作traversal
(其实是广义的traversal
)。graph process
可以是OLTP
(online transactional process
),也可以是OLAP
(online analytics process
)。TinkerPop
中通常提到的traversal
其实往往是一种OLTP
,或者是狭义的traversal
。
TinkerPop
只定义了一个框架,graph structure
定义了图的结构和数据表示,它是一个基于标签(label
)的属性图(property graph
),这种图由顶点(vertex
)和边(edge
)组成,每个顶点和边有且只有一个标签,同时顶点和边可以有0个或多个属性(key/value值对)。但TinkerPop
并没有提供graph structure
的具体实现,图的顶点和边等结构具体如何存储和访问由graph provider
,比如janusgraph
、hugegraph
等具体实现。graph structure
可以说是定义了TinkerPop
与graph provider
的接口。graph process
是对graph
的数据的处理,即图遍历(traversal
),相当于是TinkerPop
与用户之间的接口。Gremlin
则是一个图遍历语言(graph traversal language
),用户使用Gremlin
来对图进行遍历分析。
Tinker
的本来意思是补锅匠,小修理匠,TinkerPop
意即很多小匠人的集合,它们组合起来可以处理图领域的各类问题。Gremlin
的本意是精灵
,可见在TinkerPop
组成成员中的重要性。TinkerPop的官网用了一张图来形象地表示TinkerPop,这个图是一个精灵驾驶着由各种工具组成的机器人。

2 gremlin简单介绍
gremlin
是一种图数据库的查询语言。gremlin
与图数据库的关系相当于SQL与关系型数据库的关系。因为对图的常见处理是对图的元素(vertex
和edge
)进行遍历,所以gremlin
是一种图遍历语言(graph traversal language
)。同时gremlin
是一种函数式(functional
)、数据流(data-flow
)的语言。函数式、流式处理中的数据经过一个个阶段(stage
),每一个阶段对数据进行过滤、转换等处理,从而输出最终的数据,跟图处理中根据一些条件选择vertex
集合,然后沿着图的edge
和vertex
进行遍历,得到最终的vertex
或edge
是非常一致的。从这个角度来讲把gremlin
设计成一个流式语言还是非常合适的。
2.1 OLTP和OLAP遍历
gremlin可以同时表述OLTP查询和OLAP查询,Gremlin Traversal Machine
会根据gremlin表达意图,自动确定进行OLTP处理或OLAP处理(多机协同处理),甚至可以在一次遍历中一部分是OLTP,另一部分是OLAP。这样用户无需OLTP使用一种语言,OLAP使用一种语言。
2.2 命令式(Imperative)和声明式(Declarative)遍历
相对与SQL和Cypher这些声明式数据库查询语言,gremlin既可以写成命令式的,也可以写成声明式的。
比如用命令式表达一次遍历:
g.V().has("name","gremlin").as("a").
out("created").in("created").
where(neq("a")).
in("manages").
groupCount().by("name")
上面同样的功能也可以用声明式表达:
g.V().match(
as("a").has("name","gremlin"),
as("a").out("created").as("b"),
as("b").in("created").as("c"),
as("c").in("manages").as("d"),
where("a",neq("c"))).
select("d").
groupCount().by("name")
2.3 与编程语言风格保持一致(Host Language Embedding)
现在很多高级语言都支持流式编程了,而gremlin也是一种流式语言,这样图查询语言与编程语言风格是一样的,他们之间的转换也变的非常方便。无需像SQL一样,编程人员还需要熟悉一种与编程语言差异极大的语言,gremlin中甚至包含了所有高级编程语言中都会有的if、if...else...、for、do...while、while等流程控制语句。
2.4 主要概念和组成
Gremlin中涉及的几个主要概念:
Traversal
:gremlin对图数据库的一次查询(或者说遍历,或者说数据分析处理)过程叫做Traversal
Step
:Traversal由一个个step串接组成,step相当于流式处理中的stage的概念。它负责对图数据元素的一次处理步骤,如过滤、映射等。前一级step的输出是后一级step的输入。
Traverser
:字面意思是遍历者。每一个step都有一个自己的traverser,它其实是step的上下文,包含了step待处理的输入数据,或循环的次数,或其他的一些全局信息。
TraversalSource
:traversal中,前一个step的输出是后一个step的输入,那么第一个step的数据来源于哪里?这就是TraversalSource,其实就是图数据库中的数据
2.5 gremlin中的step
2.5.1 中间step和terminal step
gremlin作为一个流式语言,自然具备流处理的基本结果。中间step对数据进行转换,terminal step收集结果数据并输出
2.5.2 五种基本中间step
gremlin定义了很多很多的中间step来进行不同的处理,满足不同的需求,但中间step可以归纳为五种类型:
-
map
:即流式处理中的map概念 -
flatmap
:即流式处理中的flatmap概念 -
filter
:即流式处理中的filter概念 -
sideeffect
:全局信息。这些信息会传给后面的step -
branch
:分支。输入数据根据不同的条件走不同的遍历路径。
2.5.3 step modulator
step modulator用来修饰step,指导step如何处理数据。最常见的就是as()和by()了。比如排序order() step, group()没有携带参数,它本身不知道如何进行聚合,需要by() modulator来告诉group()如何聚合
3 gremlin的常见参考资料
如前所述,gremlin是一种功能非常强大的图遍历语言,综合了多种模式和应用场景。也许正因为如此,gremlin也是一种比较复杂的语言,学习曲线相对于SQL、CYPHER这些声明式语言要陡峭些。相对来说,gremlin对软件开发人员来说更友好些。但是很多使用图数据库进行数据分析的人员往往并不是开发人员,声明式的语言对他们来说可能更友好些,而且gremlin的声明式描述方法也没有SQL、CYPHER直观。所以这个系列对gremlin进行了一些简单的归纳总结,对常用的一些命令的使用进行了一些说明,希望能让大家尽快入门。本系列使用的例子数据主要是官网提供的TinkerPop modern数据库,例子的命令也大部分是官方文档的例子命令。相信大家熟悉了本系列的命令后,再要了解查询命令时都直接看官方文档了。
官网维护的文档还是非常好的,入门的部分文档连接如下: