第14期 Gremlin Steps:
choose()
、branch()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据。
上一期:深入学习Gremlin(13):路径选取与过滤
choose和branch说明
在对图进行遍历分析时,有时需要根据某些条件对当前的对象集合进行不同的操作,也就是if-then-else
语法结构。Gremlin中有一类step可以满足这种分支需求,这组step叫做branch step
。branch()
是这类step的基础,比较抽象,而choose()
是典型的branch step
。
choose()
的基本使用方法有两类:
- 单独使用,
choose(predicate, true-traversal, false-traversal)
:根据predicate
判断,当前对象满足时,继续true-traversal
,否则继续false-traversal
- 与option配合使用,
choose(traversal).option(value1, traversal1).option(...)...
:根据对象通过traversal
的结果决定后续操作,如果结果是value1
,则该对象继续traversal1
,以此类推
option()
不是一种Gremlin step,只是一种辅助语法,可与choose()
配合使用
实例讲解
1. if-then-else
型choose()
语句
// 查找所有的“person”类型的顶点
// 如果“age”属性小于等于20,输出他的朋友的名字
// 如果“age”属性大于20,输出他开发的软件的名字
// choose(condition, true-action, false-action)
g.V().hasLabel('person')
.choose(values('age').is(lte(20)),
__.in('knows'),
__.out('created')).values('name')
2. option()
型choose()
语句
// 查找所有的“person”类型的顶点
// 如果“age”属性等于0,输出名字
// 如果“age”属性等于28,输出年龄
// 如果“age”属性等于29,输出他开发的软件的名字
// choose(predicate).option().option()...
g.V().hasLabel('person')
.choose(values('age'))
.option(0, values('name'))
.option(28, values('age'))
.option(29, __.out('created').values('name'))
3. 如果choose(predicate, true-traversal, false-traversal)
中false-traversal
为空或者是identity()
,则不满足条件的对象直接通过choose()
// 查找所有顶点,
// 类型为“person”的顶点输出其创建的软件的“name”属性
// 否则输出顶点自身的“name”属性
g.V().choose(hasLabel('person'),
out('created'))
.values('name')
// 查找所有顶点,
// 类型为“person”的顶点输出其创建的软件的“name”属性
// 否则输出顶点自身的“name”属性
g.V().choose(hasLabel('person'),
out('created'),
identity())
.values('name')
4. choose()
和option()
配合使用时,还提供了一个none
,不满足其他选项的对象,执行none
选项的traversal
// 查找所有类型为“person”的顶点,
// “name”属性为“Zhoney Zhang”的输出其“age”属性
// 否则输出顶点的“name”属性
g.V().hasLabel('person')
.choose(values('name'))
.option('Zhoney Zhang', values('age'))
.option(none, values('name'))
5. branch()
branch()
有三种用法:
- lambda方式,filter{it.get()…}
- Traversal方式,filter(Traversal)
- 特定branch step方式
// 查询所有顶点
// “name”属性值为“HugeGraph”的顶点输出其“lang”属性
// “name”属性值不为“HugeGraph”的顶点输出其“name”属性
// lambda方式
g.V().branch {it.get().value('name')}
.option('HugeGraph', values('lang'))
.option(none, values('name'))
// 查询所有顶点
// “name”属性值为“HugeGraph”的顶点输出其“lang”属性
// “name”属性值不为“HugeGraph”的顶点输出其“name”属性
// traversal方式
g.V().branch(values('name'))
.option('HugeGraph', values('lang'))
.option(none, values('name'))
// 查询所有顶点
// “name”属性值为“HugeGraph”的顶点输出其“lang”属性
// “name”属性值不为“HugeGraph”的顶点输出其“name”属性
// 特定branch step方式
g.V().choose(has('name','HugeGraph'),
values('lang'),
values('name'))