添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

第2期 Gremlin Steps:

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

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

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

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

  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条件过滤

    doNotCheckCapabilities(不检查功能) numDecimalPlaces(-num-decimal-places) outputOutOfBagComplexityStatistics(-输出袋外复杂性统计信息) numExecutionSlots(-num-slots) printClassifiers(打印) RepresentativeC op iesU 实例化一个脚本对象: var Gremlin Script = require ( ' gremlin -script' ) . Gremlin Script ; var gremlin = new Gremlin Script ( ) ; 获取对 形的引用: var Graph = require ( ' gremlin -script' ) . Structure . Graph ; var g = new Graph ( 'g' ) ; // pass graph identifier/name to 您必须首先以特定于平台的方式安装 Graphviz 包。 查看单元测试了解更多信息,但这里有一个味道: // Create a Gremlin graph with some data. var Gremlin = require ( ' gremlin -v3' ) ; var gremlin = new Gremlin ( ) ; var Tink erFactory = gremlin . java . import ( 'com. tink erp op . gremlin . tink ergraph.structure. Tink erFactory' ) ; var gremlin Graph = gremlin . wrap ( Tink erFactory . createCla 注意:此项目不再维护。 项目所有者现在使用 ,它利用了 。 我们建议你看看这两个项目。 用于 node.js 的实现。 Gremlin -node 是一个围绕 Gremlin API 的 javascript 包装器。 node-java 模块提供了 node 和 Java 之间的桥梁。 var Gremlin = require ( ' gremlin ' ) ; var gremlin = new Gremlin ( { classpath : [ ... ] , op tions : [ ... ] } ) ; var Tink erGraphFactory = gremlin . java . import ( 'com. tink erp op .blueprints.impls.tg. Tink erGraphFactory' ) ; var graph = Tink erG Problem Description: 着色问题是一个著名的NP完全问题。给定无向 G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是 着色问题的一个解。 Input: 输入在第一行给出3个整数V(0<V≤500)、E(≥0)和K(0<K≤V),... 文章目录一、树的概念1、特点2、树的术语3、树的种类4、树的存储与表示5、常见的树的应用场景二、二叉树1、概念2、性质 一、树的概念 树是一种抽象数据类型(ADT)或是视作这种抽象数据类型的数据结构 每个节点有零个或多个子节点 没有父节点的节点称为根节点 每一个非根节点有且只有一个父节点 除了根节点外,每个子节点可以分为**多个不相交(因为都只有一个父节点)**的子树 2、树的术语 节点的度:一个节点含有的子树的个数称为该节点的度 树的度:一棵树中,最大的节点的度称为树的度 叶节点或终端节点 文章目录1. RDF 数据模型1.1 资源描述框架RDF1.2 RDF 数据模型1.3 RDF Schema(简称RDFS)2.SPARQL查询语言2.1 SPARQL 语法2.2 SPARQL 命名空间2.3 SPARQL 数据集2.4 SPARAL 查询语言2.5 模式定义2.6 SPAQAL 组 模式 联合 模式2.7 SPAQAL 符号优先级2.8 SPAQAL 结果修饰2.9 SPAQAL语义2.10 模式的匹配2.11 SPARQL 新特性3.属性 模型和Cypher查询语言3.1 属性 1.1 深度优先 遍历 的定义     深度优先搜索(Depth_First Search) 遍历 类似于树的先根 遍历 ,是树的先根 遍历 的推广。 假设给定 G, 中所有顶点未曾被访问过,则深度优先搜索可以从 中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先 遍历 ,直至 中所有和v有路径相通的顶点都被访问到;若此时 中尚有顶点未被访问,则另选 中一个未曾 今天遇到了两道要求 遍历 所有最短路径的题,我一直做不对的原因竟是我把无向 当成了有向 ,郁闷的要死。 解决 遍历 所有最短路径,其实思路很简单,首先通过经典算法[各种算法,Dijkstra,bellman,floyd]求出最短路径的长度,然后就只能DFS来找寻起始点、终点一样,长度为最短路径长度的路径即可,在DFS中可以使用Path[]数组来保存路径。 DFS时注意要剪枝,路径上已经走过的点不要重复 [2, 4, 6, 8, 10] 原因很简单,for会去获取列表的迭代器,每次循环时按次序获取内容,这次取n下次循环就取n+1,但是循环体中对列表做remove 操作 ,导致每次循环列表中的元素都会前移一位,也就是n+1变为了n,而n+... 到了新公司用到了 tink erP op gremlin 语句,由于是全英文的文档。为了杜绝我鱼记忆,决定整理一下以后查看方便。嗯嗯~ o(* ̄▽ ̄*)o附 :语句来源于 片初步认识:点:蓝色的圈代表顶点(查询语句中的V()),圈中的person代表顶点的名称,name和age为顶点的属性。边:黑色的线代表边(查询语句中的E()),线上的knows代表边的名称,weight为边的属性。一、Lambda S...