
# 使用Gremlin语句查询图
Gremlin是Apache Tinkerpop框架中使用的图遍历语言，使用Gremlin可以很方便的对图数据进行查询，进行图的修改、局部遍历和属性过滤等。
![](https://support.huaweicloud.com/usermanual-ges/public_sys-resources/note_3.0-zh-cn.png)
2.5.0版本开始不再支持gremlin查询，请使用[cypher查询](https://support.huaweicloud.com/usermanual-ges/ges_01_0098.html)。
具体操作步骤如下：
1. 进入图引擎编辑器页面，详细操作请参见[访问图引擎编辑器](https://support.huaweicloud.com/usermanual-ges/ges_01_0022.html)。
2. 在图数据查询区，单击下拉按钮，切换到Gremlin查询，输入查询语句，按"回车"键执行操作。
   图1切换到Gremlin查询   
   ![](https://support.huaweicloud.com/usermanual-ges/zh-cn_image_0000002374885629.png) 
#### Gremlin查询语句
常用的查询语句如下所示：
- 点查询 g.V().limit(100)：查询所有点，但限制点的返回数量为100，也可以使用range(x, y)的算子，返回区间内的点数量。
  g.V().hasLabel('movie')：查询点的label值为movie的点。
  g.V('11')：查询id为11的点。
  ![](https://support.huaweicloud.com/usermanual-ges/public_sys-resources/note_3.0-zh-cn.png)
  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().values('userid').limit(10)：查询点的属性为userid的值（可不填参数，表示查询所有属性， 一个点每个属性一行结果，只有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的边。
  
![](https://support.huaweicloud.com/usermanual-ges/public_sys-resources/note_3.0-zh-cn.png)
1. 如果您输入了多个Gremlin查询命令，可以在输入框中通过上下方向键来查找历史命令。
2. Gremlin查询支持联想历史记录的功能，根据您输入的语法关键字会自动显示您刚输入过的语法供您参考和选择，帮助您提高查询效率。
   图2Gremlin联想查询   
   ![](https://support.huaweicloud.com/usermanual-ges/zh-cn_image_0000002340927782.png) 
3. 输入栏中的关键词，不同的类型会呈现出不同的颜色，具体颜色区分如下：
   - 保留字：灰色 注意：保留字是编程语言中的一类语法结构。在特定的编程语言里，这些保留字具有较为特殊的意义，并且在语言的格式说明里被预先定义。
     
   
   - String类型：橙色
   
   - 分隔符（包含 \[\] {} , ; () . 等）：红色
   
   - 变量：绿色
   
   
   图3Gremlin关键字高亮   
   ![](https://support.huaweicloud.com/usermanual-ges/zh-cn_image_0000002374925737.png) 
 
#### Gremlin特殊语法优化
GES集成了gremlin中的OLTP功能，并在一定程度上做了部分功能增强与strategy优化。
- **增强版Text Predicate**
  g.V().has('name', Text.textSubString('xx'))
  
  | Predicate       | 描述         |
  |:---|:---|
  | textSubString   | 子字符串       |
  | textCISubString | 忽略大小写的子字符串 |
  | textFuzzy       | 模糊匹配       |
  | textPrefix      | 前缀查询       |
  | textRegex       | 正则匹配       |
     
  ![](https://support.huaweicloud.com/usermanual-ges/public_sys-resources/note_3.0-zh-cn.png)
  在指定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官网](https://tinkerpop.apache.org/docs/current/reference/#_features)。
```
gremlin> graph.features()
==>FEATURES
```
![](https://support.huaweicloud.com/usermanual-ges/public_sys-resources/note_3.0-zh-cn.png)
目前暂时不支持以下step命令：
- tryNext()
- explain()
- tree()
 
