背景
Gremlin是Apache TinkerPop框架下实现的图遍历语言,支持OLTP与OLAP,是目前图数据库领域主流的查询语言,可类比SQL语言之于关系型数据库。
HugeGraph是国内的一款开源图数据库,完全支持Gremlin语言。本文将讲述如何在HugeGraph图数据库上通过Gremlin来构建一张图,并进行一些基本的图分析。该图描述了TinkerPop框架、Gremlin语言、相关图数据库及其作者等实体之间的关系。最终图的效果如下:

构建图
参考官网文档的说明,整个图构建分为如下4步:准备图模型、创建Schema、添加顶点与边、验证结果。下面的Gremlin语句均在HugeGraph-Studio中执行。
准备图模型
构建图之前,需要先考虑好图模型是什么样子,就像在关系型数据库里面,建表之前需要先构思好表结构及表关联关系一样,当然HugeGraph图数据库的建模相比关系数据库来说简单一些,针对某类实体,HugeGraph只需要把关注点放在:哪些实体类与它有联系,就加一类关联边,比如在人与人之间加一类朋友关联。
在HugeGraph里面,一类实体由顶点类型(VertexLabel)来表述;一类关联边由边类型(EdgeLabel)来表述;实体或关联边可以包含属性,一类属性由属性类型(PropertyKey)来表述。
在本实例中,包含如下结构:
1) 包括3种VertexLabel:人”person”、软件”software”、语言”language”。
2) 包括6种EdgeLabel:人认识人”knows”、人创建软件”created”、软件包含软件”contains”、软件定义语言”define”、软件实现软件”implements”、软件支持语言”supports”。
3) 此外包括6种PropertyKey:姓名”name”、年龄”age”、地址”addr”、使用语言”lang”、标签”tag”、权重”weight”。
创建Schema(内容较多,完整代码请阅读原文)
创建属性类型(PropertyKey)
创建顶点类型(VertexLabel)
创建边类型(EdgeLabel)
添加顶点与边(内容较多,完整代码请阅读原文)
添加TinkerPop相关顶点与边
添加HugeGraph相关顶点与边
添加Titan相关顶点与边
验证结果
查询所有的顶点及其关联边,验证结果是否为构想好的图。
// 查询所有的顶点"g.V()"g.V()
分析图
基于上述构建好的图,可以进一步进行图查询与分析。下面给出了几个典型的应用。
根据顶点类型和名称来查询”Gremlin“顶点:
// g.V()表示查询顶点,hasLabel过滤顶点类型,has过滤属性g.V().hasLabel("language")
.has("name", "Gremlin")执行结果:顶点
Gremlin查询哪些图数据库支持Gremlin:
// in表示查询顶点的入顶点,也就是指向Gremlin顶点的顶点g.V().hasLabel("language")
.has("name", "Gremlin").in("supports")执行结果:顶点
HugeGraph
、顶点Titan
、顶点TinkerGraph查询支持Gremlin的数据库的作者,并且年龄是29岁:
// in后面可以接has进行条件过滤g.V().hasLabel("language")
.has("name", "Gremlin").in("supports").in("created")
.has("age", 29)执行结果:顶点
Marko A. Rodriguez
、顶点Jermy Li
、顶点Zhoney Zhang查看上一个查询(查询3)所经过的路径:
// path表示每一步的中间结果都会保留下来,最终作为路径g.V().hasLabel("language")
.has("name", "Gremlin").in("supports").in("created")
.has("age", 29).path().by("name")执行结果:共3条路径分别是
Gremlin
-Titan
-Marko A. RodriguezGremlin
-HugeGraph
-Jermy LiGremlin
-HugeGraph
-Zhoney Zhang查询路径时保留所经过的边信息
// inE表示顶点的入边,outV表示边的出顶点,两步加起来等价于ing.V().hasLabel("language")
.has("name", "Gremlin").inE("supports").outV().path()执行结果:共3条路径分别是(中间保留了边ID信息)
Gremlin
-S3:Titan>6>>S4:Gremlin
-TitanGremlin
-S3:HugeGraph>6>>S4:Gremlin
-HugeGraphGremlin
-S3:TinkerGraph>6>>S4:Gremlin
-TinkerGraph将查询到的路径信息以图的形式展现
g.V().hasLabel("language")
.has("name", "Gremlin").inE("supports").outV().inE("created").outV()
.has("age", 29).path()执行结果:

更多Gremlin语法可参考TinkerPop官网文档:
http://tinkerpop.apache.org/docs/current/reference/#traversal
请点击“阅读原文”查看完整代码。




