更新时间:2022-12-08 GMT+08:00

Gremlin查询

操作场景

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

操作步骤

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

    图1 切换到Gremlin查询

Gremlin查询语句

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

  • 点查询

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

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

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

    1. 不推荐使用“g.V()”语法,由于点过大时,这种查询方式影响展示效果。
    2. 为了避免返回数据过大导致系统查询耗时过长,强烈建议您添加limit参数,并且将limit参数设置在1000以内,展示效果更佳。
  • 边查询

    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)。

  • 新增点

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

  • 删除点

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

  • 新增边

    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(V('501')).to(V('502'))

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

  • 删除边

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

  1. 如果您输入了多个Gremlin查询命令,可以在输入框中通过上下方向键来查找历史命令。
  2. Gremlin查询支持联想历史记录的功能,根据您输入的语法关键字会自动显示您刚输入过的语法供您参考和选择,帮助您提高查询效率。
    图2 Gremlin联想查询
  3. 输入栏中的关键词,不同的类型会呈现出不同的颜色,具体颜色区分如下:
    • 保留字:灰色

      注意:保留字是编程语言中的一类语法结构。在特定的编程语言里,这些保留字具有较为特殊的意义,并且在语言的格式说明里被预先定义。

    • String类型:橙色
    • 分隔符(包含 [] {} , ; () . 等):红色
    • 变量:绿色
    图3 Gremlin关键字高亮

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()