更新时间:2022-02-22 GMT+08:00

Gremlin查询

操作场景

Gremlin是Apache Tinkerpop框架中使用的图遍历语言,使用Gremlin可以很方便的对图数据进行查询,进行图的修改、局部遍历和属性过滤等。

操作步骤

  1. 进入图引擎编辑器页面,详细操作请参见访问图引擎编辑器
  2. 在图数据查询区,单击下拉按钮,切换到Gremlin查询,输入查询语句,按“回车”键执行操作。

    图1 切换到Gremlin查询

    常用的查询语句如下所示。

    • 点查询

      g.V().limit(100):查询所有点,但限制点的返回数量为100,也可以使用range(x, y)的算子,返回区间内的点数量。

      g.V().hasLabel('movie') :查询点的label值为'movie'的点。

      g.V('11') :查询id为‘11’的点。

      不推荐使用“g.V()”语法,由于点过大时,这种查询方式影响展示效果。

    • 边查询

      g.E():查询所有边,不推荐使用,边数过大时,这种查询方式不合理,一般需要添加过滤条件或限制返回数量。

      g.E('55-81-5'):查询边id为‘55-81-5’的边。

      g.E().hasLabel('rate'):查询label为‘rate’的边。

      g.V('46').outE('rate'):查询点id为‘46’所有label为‘rate’的边。

    • 属性查询

      g.V().limit(3).valueMap():查询点的所有属性(可填参数,表示只查询该点, 一个点所有属性一行结果)。

      g.V().limit(1).label():查询点的label。

      g.V().limit(10).values('userid'):查询点的name属性(可不填参数,表示查询所有属性, 一个点每个属性一行结果,只有value,没有key)。

    • 新增点
      • 方式1:

        a = graph.addVertex(label,'user',id,'500','age','18-24'):新增点,Label为user,ID为500,age为18-24。

      • 方式2:

        g.addV('user').property(id,'600').property('age','18-24'):新增点,Label为user,ID为600,age为18-24。

    • 删除点

      g.V('600').drop():删除ID为600的点。

    • 新增边
      • 方式1:

        g.addV('user').property(id,'501').property('age','18-24')

        g.addV('movie').property(id,'502').property('title','love')

        g.addE('rate').property('Rating', '4').from(g.V('501')).to(g.V('502'))

        分别添加点,然后新增边,边的两个点ID分别为501、502。

      • 方式2:

        graph.addVertex(label,'user',id,'501','age','18-24')

        graph.addVertex(label,'movie',id,'502','title','love')

        a=g.V('501').next();b=g.V('502').next();((Vertex)a).addEdge('rate',(Vertex)b,'Rating', '4')

    • 删除边

      g.E('501-502-0').drop():删除ID为“501-502-0”的边。

Gremlin特殊语法优化

GES集成了gremlin中的OLTP功能,并在一定程度上做了部分功能增强与strategy优化。

  • 增强版Text Predicate

    g.V().has('name', Text.textSubString('xx'))

    Predicate

    描述

    textSubString

    子字符串

    textCISubString

    忽略大小写的子字符串

    textFuzzy

    模糊匹配

    textPrefix

    前缀查询

    textRegex

    正则匹配

    在指定schema时,最好不要给属性取名为id, label, property, properties。

    在进行gremlin操作时,有很多step会把结果转化为map结果。众所周知,在map结构中,是不允许出现两个相同key。一般来说当我们向一个map中重复insert多个相同的key,其value会被覆盖 or 该操作被取消。当我们把属性名取为id, label, property, properties,在很多操作中,如果id与属性中的id一起返回,结果将是不完整的。

参考信息

GES服务中的Gremlin与开源的差异点如表1所示。

表1 差异点

差异点

说明

Vertex and Edge IDs

Edge id是由source vertex的id,target vertex的id,以及区分重边的index,通过‘-’字符连接,sid-tid-index。Edge id和vertex id必须是String类型。

User Supplied IDs

只有点id允许用户提供,不能带‘-’字符。

Vertex Property IDs

和边的属性一样,点属性没有id,返回的id为点的id。

Vertex and Edge Property

GES的vertex 和 edge property由元数据文件定义,所以没有真的增加以及删除property的方法,只有修改以及清除的操作,类似property(),remove()等方法,都是修改属性的值,property()设置的值由参数决定,remove(),会把string类属性,变为空字符串,数字类属性变为0。List属性变为空list。

Variables

GES graph structure不支持variables特性。

Cardinality

GES支持single 和list cardinality,GES的点的属性的value类型由元数据文件定义,所以设置propety的值的时候,不会增加新的属性,之后修改对应的定义的属性。

Transactions

GES的Gremlin实现不支持显式地使用Transactions。

使用feature函数可以看到当前支持的Gremlin特性,显示false表示GES服务不支持此特性,显示为true表示GES服务支持此特性。

gremlin> graph.features()
==>FEATURES

目前暂时不支持以下step命令:

  • tryNext()
  • explain()
  • tree()