深入学习Gremlin(2):边的遍历操作
第2期 Gremlin Steps:
out()、in()、both()、outE()、inE()、bothE()、outV()、inV()、bothV()、otherV()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据,如下图所示:
上一期:深入学习Gremlin(1):图基本概念与操作
边遍历概念
边遍历是指通过顶点来访问与其有关联边的邻接顶点(或者仅访问邻接边),边遍历是图数据库与图计算的核心。我们先以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()示例2:
// 访问某个顶点的OUT方向邻接点 // 注意'3:TinkerPop'是顶点的id // 该id是插入顶点时自动生成的 g.V('3:TinkerPop').out()目前讲解过的Gremlin Steps中,顶点的id可通过
g.V()来获取,也可通过即将讲解的has()来获取(根据属性查询顶点)。示例3:
// 访问某个顶点的OUT方向邻接点 // 且限制仅“define”类型的边相连的顶点 g.V('3:TinkerPop').out('define')动手比一比:
g.V('3:TinkerPop').out()g.V('3:TinkerPop').out('define', 'contains')Step
in():访问顶点的IN方向邻接点示例1:
// 访问某个顶点的IN方向邻接点 g.V('3:TinkerPop').in()示例2:
// 访问某个顶点的IN方向邻接点 // 且限制了关联边的类型 g.V('3:TinkerPop').in('implements')Step
both():访问顶点的双向邻接点示例1:
// 访问某个顶点的双向邻接点 g.V('3:TinkerPop').both()示例2:
// 访问某个顶点的双向邻接点 // 且限制了关联边的类型 g.V('3:TinkerPop').both('implements', 'define')Step
outE(): 访问顶点的OUT方向邻接边示例1:
// 访问某个顶点的OUT方向邻接边 g.V('3:TinkerPop').outE()示例2:
// 访问某个顶点的OUT方向邻接边 // 且限制了关联边的类型 g.V('3:TinkerPop').outE('define')Step
inE(): 访问顶点的IN方向邻接边示例1:
// 访问某个顶点的IN方向邻接边 g.V('3:TinkerPop').inE()示例2:
// 访问某个顶点的IN方向邻接边 // 且限制了关联边的类型 g.V('3:TinkerPop').inE('implements')Step
bothE(): 访问顶点的双向邻接边示例1:
// 访问某个顶点的双向邻接边 g.V('3:TinkerPop').bothE()示例2:
// 访问某个顶点的双向邻接边 // 且限制了关联边的类型 g.V('3:TinkerPop').bothE('define', 'implements')Step
outV(): 访问边的出顶点示例1:
// 访问某个顶点的IN邻接边 // 然后获取边的出顶点 g.V('3:TinkerPop').inE().outV()一般情况下,
inE().outV()等价于in()动手试一试:
g.V('3:TinkerPop').outE().outV()Step
inV(): 访问边的入顶点示例1:
// 访问某个顶点的OUT邻接边 // 然后获取边的入顶点 g.V('3:TinkerPop').outE().inV()一般情况下,
outE().inV()等价于out()动手试一试:
g.V('3:TinkerPop').inE().inV()Step
bothV(): 访问边的双向顶点示例1:
// 访问某个顶点的OUT邻接边 // 然后获取边的双向顶点 g.V('3:TinkerPop').outE().bothV()注意:
bothV()会把源顶点也一起返回,因此只要源顶点有多少条出边,结果集中就会出现多少次源顶点Step
otherV(): 访问边的伙伴顶点示例1:
// 访问某个顶点的OUT邻接边 // 然后获取边的伙伴顶点 g.V('3:TinkerPop').outE().otherV()一般情况下,
outE().otherV()等价于out(),inE().otherV()等价于in()示例2:
// 访问某个顶点的双向邻接边 // 然后获取边的伙伴顶点 g.V('3:TinkerPop').bothE().otherV()一般情况下,
bothE().otherV()等价于both()
综合运用
多度查询
// 4度out()查询 // 通过id找到“javeme”作者顶点 // 通过out()访问其创建的软件 // 继续通过out()访问软件实现的框架 // 继续通过out()访问框架包含的软件 // 继续通过out()访问软件支持的语言 g.V('javeme').out('created').out('implements').out('contains').out('supports')查询支持Gremlin语言的软件的作者
// 通过id找到“Gremlin”语言顶点 // 通过in()访问支持Gremlin的软件 // 继续通过in()访问软件的作者 g.V('4:Gremlin').in('supports').in('created')查询某个作者的共同作者
// 通过id找到“javeme”作者顶点 // 通过out()访问其创建的软件 // 通过in()访问软件的所有作者 g.V('javeme').out('created').in('created')
下一期:深入学习Gremlin(3):has条件过滤
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
