Gremlin查询
操作场景
Gremlin是Apache Tinkerpop框架中使用的图遍历语言,使用Gremlin可以很方便的对图数据进行查询,进行图的修改、局部遍历和属性过滤等。
操作步骤
- 进入图引擎编辑器页面,详细操作请参见访问图引擎编辑器。
- 在图数据查询区,单击下拉按钮,切换到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:
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')
- 方式1:
- 删除边
- 点查询
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所示。
差异点 |
说明 |
---|---|
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()