gremlin语言介绍一:前言

2020-07-05  本文已影响0人  生饼

1 gremlin与TinkerPop的关系

TinkerPop是一个开源图计算框架(Graph Computing Framework),它主要提供图计算(graph computing)领域一些通用接口和工具。在TinkerPop中,graph computinggraph structuregraph process组成。graph structure也称作graphgraph process也称作traversal(其实是广义的traversal)。graph process可以是OLTPonline transactional process),也可以是OLAPonline analytics process)。TinkerPop中通常提到的traversal其实往往是一种OLTP,或者是狭义的traversal

TinkerPop只定义了一个框架,graph structure定义了图的结构和数据表示,它是一个基于标签(label)的属性图(property graph),这种图由顶点(vertex)和边(edge)组成,每个顶点和边有且只有一个标签,同时顶点和边可以有0个或多个属性(key/value值对)。但TinkerPop并没有提供graph structure的具体实现,图的顶点和边等结构具体如何存储和访问由graph provider,比如janusgraphhugegraph等具体实现。graph structure可以说是定义了TinkerPopgraph provider的接口。graph process是对graph的数据的处理,即图遍历(traversal),相当于是TinkerPop与用户之间的接口。Gremlin则是一个图遍历语言(graph traversal language),用户使用Gremlin来对图进行遍历分析。

Tinker的本来意思是补锅匠,小修理匠,TinkerPop意即很多小匠人的集合,它们组合起来可以处理图领域的各类问题。Gremlin的本意是精灵,可见在TinkerPop组成成员中的重要性。TinkerPop的官网用了一张图来形象地表示TinkerPop,这个图是一个精灵驾驶着由各种工具组成的机器人。

image.png

2 gremlin简单介绍

gremlin是一种图数据库的查询语言。gremlin与图数据库的关系相当于SQL与关系型数据库的关系。因为对图的常见处理是对图的元素(vertexedge)进行遍历,所以gremlin是一种图遍历语言(graph traversal language)。同时gremlin是一种函数式(functional)、数据流(data-flow)的语言。函数式、流式处理中的数据经过一个个阶段(stage),每一个阶段对数据进行过滤、转换等处理,从而输出最终的数据,跟图处理中根据一些条件选择vertex集合,然后沿着图的edgevertex进行遍历,得到最终的vertexedge是非常一致的。从这个角度来讲把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可以归纳为五种类型:

  1. map:即流式处理中的map概念
  2. flatmap:即流式处理中的flatmap概念
  3. filter:即流式处理中的filter概念
  4. sideeffect:全局信息。这些信息会传给后面的step
  5. 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数据库,例子的命令也大部分是官方文档的例子命令。相信大家熟悉了本系列的命令后,再要了解查询命令时都直接看官方文档了。

官网维护的文档还是非常好的,入门的部分文档连接如下:

上一篇 下一篇

猜你喜欢

热点阅读