转载自:https://blog.csdn.net/javeme/article/details/82627396
第2期 Gremlin Steps:
out()
、in()
、both()
、outE()
、inE()
、bothE()
、outV()
、inV()
、bothV()
、otherV()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据,如下图所示:
边遍历概念
边遍历是指通过顶点来访问与其有关联边的邻接顶点(或者仅访问邻接边),边遍历是图数据库与图计算的核心。我们先以TinkerPop官网的例子来解释一下边遍历的相关Steps:
顶点为基准的Steps(如上图中的顶点“4”):
out(label)
: 根据指定的EdgeLabel来访问顶点的OUT方向邻接点(可以是零个EdgeLabel,代表所有类型边;也可以一个或多个EdgeLabel,代表任意给定EdgeLabel的边,下同)in(label)
: 根据指定的EdgeLabel来访问顶点的IN方向邻接点both(label)
: 根据指定的EdgeLabel来访问顶点的双向邻接点outE(label)
: 根据指定的EdgeLabel来访问顶点的OUT方向邻接边inE(label)
: 根据指定的EdgeLabel来访问顶点的IN方向邻接边bothE(label)
: 根据指定的EdgeLabel来访问顶点的双向邻接边
边为基准的Steps(如上图中的边“knows”):
outV()
: 访问边的出顶点(注意:这里是以边为基准,上述Step均以顶点为基准),出顶点是指边的起始顶点inV()
: 访问边的入顶点,入顶点是指边的目标顶点,也就是箭头指向的顶点bothV()
: 访问边的双向顶点otherV()
: 访问边的伙伴顶点,即相对于基准顶点而言的另一端的顶点
实例讲解
下面通过实例来深入理解每一个操作。
Step
out()
:访问顶点的OUT方向邻接点示例1:
// 先查询图中所有的顶点 // 然后访问顶点的OUT方向邻接点 // 注意:out()的基准必须是顶点 g.V().out()
- 1
- 2
- 3
- 4
示例2:
// 访问某个顶点的OUT方向邻接点 // 注意'3:TinkerPop'是顶点的id // 该id是插入顶点时自动生成的 g.V('3:TinkerPop').out()
- 1
- 2
- 3
- 4
目前讲解过的Gremlin Steps中,顶点的id可通过
g.V()
来获取,也可通过即将讲解的has()
来获取(根据属性查询顶点)。示例3:
// 访问某个顶点的OUT方向邻接点 // 且限制仅“define”类型的边相连的顶点 g.V('3:TinkerPop').out('define')
- 1
- 2
- 3
动手比一比:
g.V('3:TinkerPop').out()
g.V('3:TinkerPop').out('define', 'contains')
Step
in()
:访问顶点的IN方向邻接点示例1:
// 访问某个顶点的IN方向邻接点 g.V('3:TinkerPop').in()
- 1
- 2
示例2:
// 访问某个顶点的IN方向邻接点 // 且限制了关联边的类型 g.V('3:TinkerPop').in('implements')
- 1
- 2
- 3
Step
both()
:访问顶点的双向邻接点示例1:
// 访问某个顶点的双向邻接点 g.V('3:TinkerPop').both()
- 1
- 2
示例2:
// 访问某个顶点的双向邻接点 // 且限制了关联边的类型 g.V('3:TinkerPop').both('implements', 'define')
- 1
- 2
- 3
Step
outE()
: 访问顶点的OUT方向邻接边示例1:
// 访问某个顶点的OUT方向邻接边 g.V('3:TinkerPop').outE()
- 1
- 2
示例2:
// 访问某个顶点的OUT方向邻接边 // 且限制了关联边的类型 g.V('3:TinkerPop').outE('define')
- 1
- 2
- 3
Step
inE()
: 访问顶点的IN方向邻接边示例1:
// 访问某个顶点的IN方向邻接边 g.V('3:TinkerPop').inE()
- 1
- 2
示例2:
// 访问某个顶点的IN方向邻接边 // 且限制了关联边的类型 g.V('3:TinkerPop').inE('implements')
- 1
- 2
- 3
Step
bothE()
: 访问顶点的双向邻接边示例1:
// 访问某个顶点的双向邻接边 g.V('3:TinkerPop').bothE()
- 1
- 2
示例2:
// 访问某个顶点的双向邻接边 // 且限制了关联边的类型 g.V('3:TinkerPop').bothE('define', 'implements')
- 1
- 2
- 3
Step
outV()
: 访问边的出顶点示例1:
// 访问某个顶点的IN邻接边 // 然后获取边的出顶点 g.V('3:TinkerPop').inE().outV()
- 1
- 2
- 3
一般情况下,
inE().outV()
等价于in()
动手试一试:
g.V('3:TinkerPop').outE().outV()
Step
inV()
: 访问边的入顶点示例1:
// 访问某个顶点的OUT邻接边 // 然后获取边的入顶点 g.V('3:TinkerPop').outE().inV()
- 1
- 2
- 3
一般情况下,
outE().inV()
等价于out()
动手试一试:
g.V('3:TinkerPop').inE().inV()
Step
bothV()
: 访问边的双向顶点示例1:
// 访问某个顶点的OUT邻接边 // 然后获取边的双向顶点 g.V('3:TinkerPop').outE().bothV()
- 1
- 2
- 3
注意:
bothV()
会把源顶点也一起返回,因此只要源顶点有多少条出边,结果集中就会出现多少次源顶点Step
otherV()
: 访问边的伙伴顶点示例1:
// 访问某个顶点的OUT邻接边 // 然后获取边的伙伴顶点 g.V('3:TinkerPop').outE().otherV()
- 1
- 2
- 3
一般情况下,
outE().otherV()
等价于out()
,inE().otherV()
等价于in()
示例2:
// 访问某个顶点的双向邻接边 // 然后获取边的伙伴顶点 g.V('3:TinkerPop').bothE().otherV()
- 1
- 2
- 3
一般情况下,
bothE().otherV()
等价于both()
综合运用
多度查询
// 4度out()查询 // 通过id找到“javeme”作者顶点 // 通过out()访问其创建的软件 // 继续通过out()访问软件实现的框架 // 继续通过out()访问框架包含的软件 // 继续通过out()访问软件支持的语言 g.V('javeme').out('created').out('implements').out('contains').out('supports')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
查询支持Gremlin语言的软件的作者
// 通过id找到“Gremlin”语言顶点 // 通过in()访问支持Gremlin的软件 // 继续通过in()访问软件的作者 g.V('4:Gremlin').in('supports').in('created')
- 1
- 2
- 3
- 4
查询某个作者的共同作者
// 通过id找到“javeme”作者顶点 // 通过out()访问其创建的软件 // 通过in()访问软件的所有作者 g.V('javeme').out('created').in('created')
- 1
- 2
- 3
- 4