深入学习Gremlin(2):边的遍历操作

第2期 Gremlin Steps:

out()in()both()outE()inE()bothE()outV()inV()bothV()otherV()

本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据,如下图所示:
init-data

上一期:深入学习Gremlin(1):图基本概念与操作

边遍历概念

边遍历是指通过顶点来访问与其有关联边的邻接顶点(或者仅访问邻接边),边遍历是图数据库与图计算的核心。我们先以TinkerPop官网的例子来解释一下边遍历的相关Steps:

vertex-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(): 访问边的伙伴顶点,即相对于基准顶点而言的另一端的顶点

实例讲解

下面通过实例来深入理解每一个操作。

  1. Step out():访问顶点的OUT方向邻接点

    示例1:

    // 先查询图中所有的顶点
    // 然后访问顶点的OUT方向邻接点
    // 注意:out()的基准必须是顶点
    g.V().out()

    g.V().out()

    示例2:

    // 访问某个顶点的OUT方向邻接点
    // 注意'3:TinkerPop'是顶点的id
    // 该id是插入顶点时自动生成的
    g.V('3:TinkerPop').out()

    g.V(id).out()

    目前讲解过的Gremlin Steps中,顶点的id可通过g.V()来获取,也可通过即将讲解的has()来获取(根据属性查询顶点)。

    示例3:

    // 访问某个顶点的OUT方向邻接点
    // 且限制仅“define”类型的边相连的顶点
    g.V('3:TinkerPop').out('define')

    g.V(id).out(label)

    动手比一比:

    g.V('3:TinkerPop').out()

    g.V('3:TinkerPop').out('define', 'contains')

  2. Step in():访问顶点的IN方向邻接点

    示例1:

    // 访问某个顶点的IN方向邻接点
    g.V('3:TinkerPop').in()

    g.V(id).in()

    示例2:

    // 访问某个顶点的IN方向邻接点
    // 且限制了关联边的类型
    g.V('3:TinkerPop').in('implements')

    g.V(id).in(label)

  3. Step both():访问顶点的双向邻接点

    示例1:

    // 访问某个顶点的双向邻接点
    g.V('3:TinkerPop').both()

    g.V(id).both()

    示例2:

    // 访问某个顶点的双向邻接点
    // 且限制了关联边的类型
    g.V('3:TinkerPop').both('implements', 'define')

    g.V(id).both(label)

  4. Step outE(): 访问顶点的OUT方向邻接边

    示例1:

    // 访问某个顶点的OUT方向邻接边
    g.V('3:TinkerPop').outE()

    g.V(id).outE()

    示例2:

    // 访问某个顶点的OUT方向邻接边
    // 且限制了关联边的类型
    g.V('3:TinkerPop').outE('define')

    g.V(id).outE(label)

  5. Step inE(): 访问顶点的IN方向邻接边

    示例1:

    // 访问某个顶点的IN方向邻接边
    g.V('3:TinkerPop').inE()

    g.V(id).inE()

    示例2:

    // 访问某个顶点的IN方向邻接边
    // 且限制了关联边的类型
    g.V('3:TinkerPop').inE('implements')

    g.V(id).inE(label)

  6. Step bothE(): 访问顶点的双向邻接边

    示例1:

    // 访问某个顶点的双向邻接边
    g.V('3:TinkerPop').bothE()

    g.V(id).bothE()

    示例2:

    // 访问某个顶点的双向邻接边
    // 且限制了关联边的类型
    g.V('3:TinkerPop').bothE('define', 'implements')

    g.V(id).bothE(label)

  7. Step outV(): 访问边的出顶点

    示例1:

    // 访问某个顶点的IN邻接边
    // 然后获取边的出顶点
    g.V('3:TinkerPop').inE().outV()

    g.V(id).inE().outV()

    一般情况下,inE().outV()等价于in()

    动手试一试:g.V('3:TinkerPop').outE().outV()

  8. Step inV(): 访问边的入顶点

    示例1:

    // 访问某个顶点的OUT邻接边
    // 然后获取边的入顶点
    g.V('3:TinkerPop').outE().inV()

    g.V(id).outE().inV()

    一般情况下,outE().inV()等价于out()

    动手试一试:g.V('3:TinkerPop').inE().inV()

  9. Step bothV(): 访问边的双向顶点

    示例1:

    // 访问某个顶点的OUT邻接边
    // 然后获取边的双向顶点
    g.V('3:TinkerPop').outE().bothV()

    g.V(id).outE().bothV()

    注意:bothV()会把源顶点也一起返回,因此只要源顶点有多少条出边,结果集中就会出现多少次源顶点

  10. Step otherV() : 访问边的伙伴顶点

    示例1:

    // 访问某个顶点的OUT邻接边
    // 然后获取边的伙伴顶点
    g.V('3:TinkerPop').outE().otherV()

    g.V(id).outE().otherV()

    一般情况下,outE().otherV()等价于out()inE().otherV()等价于in()

    示例2:

    // 访问某个顶点的双向邻接边
    // 然后获取边的伙伴顶点
    g.V('3:TinkerPop').bothE().otherV()

    g.V(id).bothE().otherV()

    一般情况下,bothE().otherV()等价于both()

综合运用

  1. 多度查询

    // 4度out()查询
    // 通过id找到“javeme”作者顶点
    // 通过out()访问其创建的软件
    // 继续通过out()访问软件实现的框架
    // 继续通过out()访问框架包含的软件
    // 继续通过out()访问软件支持的语言
    g.V('javeme').out('created').out('implements').out('contains').out('supports')

    g.V(id).out()4

  2. 查询支持Gremlin语言的软件的作者

    // 通过id找到“Gremlin”语言顶点
    // 通过in()访问支持Gremlin的软件
    // 继续通过in()访问软件的作者
    g.V('4:Gremlin').in('supports').in('created')

    g.V(id).in()2

  3. 查询某个作者的共同作者

    // 通过id找到“javeme”作者顶点
    // 通过out()访问其创建的软件
    // 通过in()访问软件的所有作者
    g.V('javeme').out('created').in('created')

    g.V(id).out().in()

下一期:深入学习Gremlin(3):has条件过滤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章