gremlin 订阅
Gremlin
信息
操作系统
跨平台
开发语言
JavaGroovy
开源协议
BSD
Gremlin
Gremlin 是在某些领域专用的语言,用来遍历属性图(property graphs)。Gremlin 使用 Pipes 来遍历复杂的图。这个语言在图像查询、分析、操作领域有所应用。
收起全文
精华内容
下载资源
问答
  • 我们正在淘汰Spring Data Gremlin。 我们建议改为将或 。 Spring Data Gremlin Spring Data Gremlin使用Gremlin查询语言为那些数据库提供了最初的Spring Data支持。 通过面向注释的编程模型,它简化了到数据库实体...
  • Gremlin-Visualizer 该项目用于可视化对应于gremlin查询的图形网络。 设置 Gremlin Visualizer 要设置 gremlin 可视化工具,您需要在系统中安装node.js和npm 。 克隆项目 git clone ...
  • 弹力gremlin 在Elasticsearch后端上的实施。 在使用弹性gremlin之前,您应该先阅读Tinkerpop。 特征 可扩展使用ElasticSearch的横向扩展功能,我们可以将图形扩展到许多节点,从而在保持良好性能的情况下启用更多...
  • spring-data-gremlin-示例 如何使用spring-data-gremlin的示例
  • 轻松生成 Gremlin 脚本。 适用于 Node.js 和浏览器。 安装 节点.js $ npm install gremlin-script -S 浏览器 该模块可作为 CommonJS、AMD 模块或独立模块(作为GremlinScript全局导出)。 应用程序接口 实例化一...
  • gremlin-repl-源码

    2021-07-13 18:51:14
    gremlin-repl 的 。 该软件包为提供的控制台应用程序提供了替代方案。 它没有使用,而是使用备用 REPL 包 。 有关不使用 Node 的 REPL 的完整理由,请参阅该包的 。 这个备用控制台的主要原因是允许为 gremlin-...
  • Gremlin-node 是一个围绕 Gremlin API 的 javascript 包装器。 node-java 模块提供了 node 和 Java 之间的桥梁。 var Gremlin = require ( 'gremlin' ) ; var gremlin = new Gremlin ( { classpath : [ ... ] , ...
  • gremlin-graphviz 使用 Graphviz 可视化 Gremlin 图。 该模块是和的混搭。 用法 您必须首先以特定于平台的方式安装 Graphviz 包。 查看单元测试了解更多信息,但这里有一个味道: // Create a Gremlin graph ...
  • 您所需要做的就是以正确的格式提供顶点和边,而gremlin-importer将为您填充图形数据库。 为了成功完成导入过程,必须遵循一些规则和限制。 有关如何导入不同格式的指南,请参见 。 安装 $ npm install -g gremlin-...
  • gremlin-aws-sigv4 该软件包为Apache的TinkerPop3 Gremlin 程序提供了扩展,该与兼容。 安装 该项目是模块,可以与一起安装。 npm install gremlin-aws-sigv4 用法 该软件包读取用于AWS身份验证的环境变量。 这些...
  • janusgraph-gremlin-driver 此包中对janusgraph-gremlin-driver作了简单包装, 仅供学习参考使用. demo: 查询总数 @org.junit.Test public void getLong() { Connection connection = new Connection.Client...
  • matlab如何敲代码GREMLIN_CPP v1.0 安装 $ g++ -O3 -std=c++0x -o gremlin_cpp gremlin_cpp.cpp -fopenmp 调用-fopenmp以允许使用多个CPU,该代码是openmp友好的。 用法 注意,openmp使用系统变量OMP_NUM_THREADS来...
  • apache-tinkerpop-gremlin-server-3.4.7-bin.zip
  • 重要说明-此处显示的Gremlin示例是指TinkerPop2.x。 请注意,TinkerPop 3.x已在Apache Software Foundation下发布。 在上找到Gremlin的最新信息。 是用于遍历属性图的领域特定语言。 该语言在图形查询,分析和操纵...
  • gremlin

    2020-05-18 17:31:29
    g.V().hasLabel('Person').outE('Knows')inE()

    g.V().hasLabel('Person').outE('Knows') inE()

     

     

     

    展开全文
  • 欢迎使用Gremlin GUI Gremlin是一个开放源代码的低代码微服务框架,旨在用于法律工程,数据提取和文档分析。 Gremlin GUI是单独的Gremlin服务器的基于React的前端。 它是根据AGPL许可的,并且是免费的开放源代码。 ...
  • spark-gremlin-源码

    2021-06-30 21:14:32
    Spark-Gremlin 是尝试实现 Tinkerpop Gremlin API ( ) 这是对 SparkGraph 项目 ( ) 的完全重写,该项目试图实现 TinkerPop V2 API。 地位 还没有任何效果 构建 Spark-Gremlin ./sbt/sbt 程序集
  • gremlose:Gremlin对graphdb的支持
  • gremlin-scala:Apache TinkerPop 3图形DSL的Scala包装器
  • matlab精度检验代码
  • gremlin, 图形遍历语言( 不再活动,请参见 Apache TinkerPop ) 现在是重要的 TinkerPop现在是Apache软件基金会和 TinkerPop 3.x的一部分,是最新版本的。 这里项目为 TinkerPop 2.x,不再处于活动状态。Gremlin是一...
  • 摘要:Gremlin是图数据库查询使用最普遍的基础查询语言。Gremlin的图灵完备性,使其能够编写非常复杂的查询语句。对于复杂的问题,我们该如何编写一个复杂的查询?以及我们该如何理解已有的复杂查询?本文带你逐步...

    本文分享自华为云社区《复杂Gremlin查询的调试方法》,原文作者:Uncle_Tom。

    1. Gremlin简介

    Gremlin是Apache TinkerPop 框架下的图遍历语言。Gremlin是一种函数式数据流语言,可以使得用户使用简洁的方式表述复杂的属性图(property graph)的遍历或查询。每个Gremlin遍历由一系列步骤(可以存在嵌套)组成,每一步都在数据流(data stream)上执行一个原子操作。

    Gremlin是一种用于描述属性图中行走的语言。图形遍历分两个步骤进行。

    1.1. 遍历源(TraversalSource)

    开始节点选择(Start node selection)。所有遍历都从数据库中选择一组节点开始,这些节点充当图中行走的起点。Gremlin中的遍历是从TraversalSource开始的。 GraphTraversalSource提供了两种遍历方法。

    • GraphTraversalSource.V(Object … ids):从图形的顶点开始遍历(如果未提供id,则为所有顶点)。
    • GraphTraversalSource.E(Object … ids):从图形的边缘开始遍历(如果未提供id,则为所有边)。

    1.2. 图遍历(GraphTraversal)

    走图(Walking the graph)。从上一步中选择的节点开始,遍历会沿着图形的边行进,以根据节点和边的属性和类型到达相邻的节点。遍历的最终目标是确定遍历可以到达的所有节点。您可以将图遍历视为子图描述,必须执行该子图描述才能返回节点。

    V()和E()的返回类型是GraphTraversal。 GraphTraversal维护许多返回GraphTraversal的方法。GraphTraversal支持功能组合。 GraphTraversal的每种方法都称为一个步骤(step),并且每个步骤都以五种常规方式之一调制(modulates)前一步骤的结果。

    1. map:将传入的遍历对象转换为另一个对象(S→E)。
    2. flatMap:将传入的遍历对象转换为其他对象的迭代器(S\subseteq E^*SE∗)。
    3. filter:允许或禁止遍历器进行下一步(S→S∪∅)。
    4. sideEffect:允许遍历器保持不变,但在过程中产生一些计算上的副作用(S↬S)。
    5. branch:拆分遍历器并将其发送到遍历中的任意位置(S→{S1→E^*,…,S_n→E^*S1→E∗,…,Sn​→E∗}→E*)。

    • GraphTraversal中几乎每个步骤都从MapStep,FlatMapStep,FilterStep,SideEffectStep或BranchStep扩展得到。
    • 举例:找到makro认识的人
    gremlin> g.V().has('name','marko').out('knows').values('name') 
    ==>vadas
    ==>josh

    1.3. Gremlin是图灵完备的(Turing Complete)

    这也就时说任何复杂的问题,都可以用Gremlin描述。

    下面就调试和编写复杂的gremlin查询,给出指导思路和方法论。

    2. 复杂Gremlin查询的调试

    Gremlin的查询都是由简单的查询组合成复杂的查询。所以对于复杂Gremlin查询可以分为以下三个步骤,并逐步迭代完成所有语句的验证,此方法同样适用编写复杂的Gremlin查询。

    2.1. 迭代调试步骤

    1. 拆分分析步骤,划大为小,逐步求证;
    2. 输出分步骤的结果,明确步骤的具体输出内容;
    3. 对输出结果进行推导和检验。依据结果扩大或缩小分析步骤,回到步骤1继续,直到清楚所有结果。
    • 注: 此方法参照Stephen Mallette gremlins-anatomy的分析逻辑和用例。

    2.2. 用例

    2.2.1. 图结构

    gremlin> graph = TinkerGraph.open()
    ==>tinkergraph[vertices:0 edges:0]
    gremlin> g = graph.traversal()
    ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
    gremlin>g.addV().property('name','alice').as('a').
      addV().property('name','bobby').as('b').
      addV().property('name','cindy').as('c').
      addV().property('name','david').as('d').
      addV().property('name','eliza').as('e').
      addE('rates').from('a').to('b').property('tag','ruby').property('value',9).
      addE('rates').from('b').to('c').property('tag','ruby').property('value',8).
      addE('rates').from('c').to('d').property('tag','ruby').property('value',7).
      addE('rates').from('d').to('e').property('tag','ruby').property('value',6).
      addE('rates').from('e').to('a').property('tag','java').property('value',10).
      iterate()
    gremlin> graph
    ==>tinkergraph[vertices:5 edges:5]

    2.2.2. 查询语句

    gremlin>g.V().has('name','alice').as('v').
       repeat(outE().as('e').inV().as('v')).
         until(has('name','alice')).
       store('a').
         by('name').
       store('a').
         by(select(all, 'v').unfold().values('name').fold()).
       store('a').
         by(select(all, 'e').unfold().
            store('x').
              by(union(values('value'), select('x').count(local)).fold()).
            cap('x').
            store('a').by(unfold().limit(local, 1).fold()).unfold().
            sack(assign).by(constant(1d)).
            sack(div).by(union(constant(1d),tail(local, 1)).sum()).
            sack(mult).by(limit(local, 1)).
            sack().sum()).
       cap('a')
    ==>[alice,[alice,bobby,cindy,david,eliza,alice],[9,8,7,6,10],18.833333333333332]

    好长,好复杂!头大!

    看我如何抽丝剥茧,一步步验证结果。

    2.3. 调试过程

    2.3.1 拆分查询

    按执行步骤,拆分成小的查询,如下图:

    • 执行第一部分步骤
    gremlin> g.V().has('name','alice').as('v').
    ......1> repeat(outE().as('e').inV().as('v')).
    ......2> until(has('name','alice'))
    ==>v[0]

    2.3.2 澄清结果

    这里通过valueMap()输出节点信息。

    gremlin> g.V().has('name','alice').as('v').
    ......1> repeat(outE().as('e').inV().as('v')).
    ......2> until(has('name','alice')).valueMap()
    ==>[name:[alice]]

    2.3.3 验证假设

    根据执行语句的语义推导查询过程,如下:

    使用path(), 验证推导过程

    g.V().has('name','alice').as('v').
    ......1> repeat(outE().as('e').inV().as('v')).
    ......2> until(has('name','alice')).path().next()
    ==>v[0]
    ==>e[10][0-rates->2]
    ==>v[2]
    ==>e[11][2-rates->4]
    ==>v[4]
    ==>e[12][4-rates->6]
    ==>v[6]
    ==>e[13][6-rates->8]
    ==>v[8]
    ==>e[14][8-rates->0]
    ==>v[0]
    • 输出结果与推导结果一致,扩大查询语句, 回到步骤1;
    • 如不一致或不理解结果, 缩小步骤范围, 可以采用此步骤的上一层查询步骤,回到步骤1;
    • 如此循环直到完全理解整个查询。
    gremlin> g.V().has('name','alice').as('v').
    ......1> repeat(outE().as('e').inV().as('v')).
    ......2> until(has('name','alice')).
    ......3> store('a').by('name')
    ==>v[0]

    大家可以自己去细细的剥下笋,此处略去3000字。

    3. 总结

    • 在分析的过程,采用划分查询语句的方法,分步理解,采用漏斗式的方法,逐步扩大对语句的理解;
    • 对每步的查询结果,可以采用利用valueMap(), path(), select(), as(), cap() 等函数输出和验证结果;
    • 对于不清楚结果的步骤或与期望值不一致,缩小查询步骤,可以采用输出步骤的前一步骤作为输出点,进行输出和验证;
    • 对于上一层数据的结果明确的情况下,可以采用inject()方式注入上层输出,继续后续的输出和验证;
    • 要注意步骤最后的函数,对整个输出结果的影响。

    4. 参考

    • Introduction to Gremlin
    • Gremlin’s Anatomy
    • TinkerPop Documentation
    • Stephen Mallette gremlins-anatomy
    • Practical Gremlin - Why Graph?

     

    点击关注,第一时间了解华为云新鲜技术~

    展开全文
  • gremlin语法详解

    千次阅读 2019-01-16 11:11:10
    gremlin> g.V().match(__.as('a').out('knows').as('b'),__.as('a').out('created').as('c'),__.as('b').out('created').as('c')).addE('friendlyCollaborator').from('a').to('b').property(id,13).property('...


    初步认识

    点:蓝色的圈代表顶点(查询语句中的V()),圈中的person代表顶点的名称,name和age为顶点的属性。

    边:黑色的线代表边(查询语句中的E()),线上的knows代表边的名称,weight为边的属性。

     

    一、Lambda Step

    四个基础的步骤:map ,flatMap ,filter,sideEffect,branch

    1. 查找节点属性

    (1). V(1)=查询图中第一个顶点  .out() = 输出的顶点  .values("name") = 属性为name的值 

    (查询第一个顶点所有边中向外指的顶点,返回这些顶点的name的值)

    gremlin> g.V(1).out().values('name')

    ==>lop

    ==>vadas

    ==>josh

    (2).返回相同的数据使用map的方式

    gremlin> g.V(1).out().map {it.get().value('name')}

    ==>lop

    ==>vadas

    ==>josh

    2. has has的用法类似于过滤器的作用

    (1).查找所有顶点中label边的值为person的(默认返回节点信息)

    gremlin> g.V().hasLabel('person')

    ==>v[1]

    ==>v[2]

    ==>v[4]

    ==>v[6]

    (2).使用过滤器filter的方式查找

    gremlin> g.V().filter {it.get().label() == 'person'}

    ==>v[1]

    ==>v[2]

    ==>v[4]

    ==>v[6]
    3. 进入sideEffect() 的任何内容都被传递到下一个步骤,但可能会发生一些中间过程。

    gremlin> g.V().hasLabel('person').sideEffect(System.out.&println)

    v[1]

    ==>v[1]

    v[2]

    ==>v[2]

    v[4]

    ==>v[4]

    v[6]

    ==>v[6]

    4.choose()和branch()

    解释:返回顶点的姓名,如果姓名为marko则返回年龄,其他的返回姓名。

    gremlin> g.V().branch(values('name')).option('marko', values('age')).option(none, values('name'))

    ==>29

    ==>vadas

    ==>lop

    ==>josh

    ==>ripple

    ==>peter

    gremlin> g.V().choose(has('name','marko'),values('age'),values('name'))

    ==>29

    ==>vadas

    ==>lop

    ==>josh

    ==>ripple

    ==>peter

     

    二、AddEdge Step

    此部分的主要功能是为已有的图形添加新的边。


    1.addE()

    例一 以上图为例

    解释:第一个顶点命名为a,查找出边为created的点(3),再次查找入边为created的点,并且这个点不是a,添加一条边,边的名称为co-developer,从a发出属性为:year,2009.

    gremlin> g.V(1).as('a').out('created').in('created').where(neq('a')).addE('co-developer').from('a').property('year',2009)

    ==>e[12][1-co-developer->4]

    ==>e[13][1-co-developer->6]

    2.addE()

    例二 

    gremlin> g.V(3,4,5).aggregate('x').has('name','josh').as('a').select('x').unfold().hasLabel('software').addE('createdBy').to('a')

    ==>e[14][3-createdBy->4]

    ==>e[15][5-createdBy->4]

    3.addE()

    例三

    解释:所有顶点为a,查找出边为created的顶点(3),增加边名称为createdBy,新增的边出点为a,属性名为acl,public。

    gremlin> g.V().as('a').out('created').addE('createdBy').to('a').property('acl','public')

    ==>e[16][3-createdBy->1]

    ==>e[17][5-createdBy->4]

    ==>e[18][3-createdBy->4]

    ==>e[19][3-createdBy->6]

    4.addE()

    例四 

    gremlin> g.V(1).as('a').out('knows').addE('livesNear').from('a').property('year',2009).inV().inE('livesNear').values('year')

    ==>2009

    ==>2009

    5.addE()

    例五 

    gremlin> g.V().match(__.as('a').out('knows').as('b'),__.as('a').out('created').as('c'),__.as('b').out('created').as('c')).addE('friendlyCollaborator').from('a').to('b').property(id,13).property('project',select('c').values('name'))

    ==>e[13][1-friendlyCollaborator->4]

     

    三、AddVertex Step

    这个过程是用户给图形增加顶点,对于每一个传入对象,都创建一个顶点。此外,GraveTraceSaleStand维护了一个addV()方法。

    1.例一 新增一个顶点person,属性为name=stephen。

    gremlin> g.addV('person').property('name','stephen')

    ==>v[12]

    2.例二 查看所有顶点的name

    gremlin> g.V().values('name')

    ==>marko

    ==>vadas

    ==>lop

    ==>josh

    ==>ripple

    ==>peter

    ==>stephen

    3.例三 所有顶点出边为knows,新增顶点,属性名为name=nothing。

    gremlin> g.V().outE('knows').addV().property('name','nothing')

    ==>v[14]

    ==>v[16]

    4.例四 查看所有顶点中name=nothing的id

    gremlin> g.V().has('name','nothing')

    ==>v[16]

    ==>v[14]

     

    四、AddProperty Step

    addProperty()用户给图中的对象增加属性。不同于addV()和addE()

    1.例一 给顶点1创建属性country=usa

    gremlin> g.V(1).property('country','usa')

    ==>v[1]

    2.例二 给顶点1创建属性city=sanfa fe,state=new mexico并返回所有属性名。

    gremlin> g.V(1).property('city','santa fe').property('state','new mexico').valueMap()

    ==>[country:[usa], city:[santa fe], name:[marko], state:[new mexico], age:[29]]

    3.例三 给顶点1创建属性age=35

    gremlin> g.V(1).property(list,'age',35)

    ==>v[1]

    4.例四 返回顶点1的所有属性值

    gremlin> g.V(1).valueMap()

    ==>[country:[usa], city:[santa fe], name:[marko], state:[new mexico], age:[29, 35]]

    5.例五 给顶点1增加属性friendWeight输出边为knows的值为weight之和,属性为ac=private

    gremlin> g.V(1).property('friendWeight',outE('knows').values('weight').sum(),'acl','private')

    ==>v[1]

    6.例六 查询顶点1的friendWeight的属性。

    gremlin> g.V(1).properties('friendWeight').valueMap()

    ==>[acl:private]

     

    五、Aggregate Step

    aggregte()用于遍历所有特定的对象集合在一起。

    1.例一

    查找顶点1输出边是created的点(3)
    gremlin> g.V(1).out('created')

    ==>v[3]

    将所有顶点1输出边为created的顶点聚合为x

    gremlin> g.V(1).out('created').aggregate('x')

    ==>v[3]

    查找所有顶点1输出边为created的顶点(3),再查找输入边为created的所有顶点

    gremlin> g.V(1).out('created').aggregate('x').in('created')

    ==>v[1]

    ==>v[4]

    ==>v[6]

    查找所有顶点1输出边为created的顶点(3),再查找输入边为created的所有顶点,再查找输出边为created的顶点

    gremlin> g.V(1).out('created').aggregate('x').in('created').out('created')

    ==>v[3]

    ==>v[5]

    ==>v[3]

    ==>v[3]

    查找所有顶点1输出边为created的顶点(3),再查找输入边为created的所有顶点,再查找输出边为created的顶点。过滤所有x(x = 顶点1输出边为created的顶点 = 3)的集合并输出name值。

    gremlin> g.V(1).out('created').aggregate('x').in('created').out('created').where(without('x')).values('name')

    ==>ripple

     

    六、And Step

    and()同时满足and()要求的条件并输出。

    1.例一 满足两个条件1.g.V().outE('knows') 2.g.V().values('age').is(lt(30))的名字

    gremlin> g.V().and(outE('knows'),values('age').is(lt(30))).values('name')

    ==>marko

     

    七、As Step

    as(),是一步虚拟的操作,类似于by()和option().

    1.例一 所有顶点命名为a,输出边为created的顶点命名为b,查询a和b。

    gremlin> g.V().as('a').out('created').as('b').select('a','b')

    ==>[a:v[1], b:v[3]]

    ==>[a:v[4], b:v[5]]

    ==>[a:v[4], b:v[3]]

    ==>[a:v[6], b:v[3]]

     

    八、By Step

    by(),是一步虚拟的操作,一般用于通过条件分组查询。

    1.例一 查询所有顶点,通过边的数量分组查询数量

    gremlin> g.V().group().by(bothE().count())

    ==>[1:[v[2], v[5], v[6]], 3:[v[1], v[3], v[4]]]

    2.例二 查询所有顶点,通过边的数量分组查询姓名

    gremlin> g.V().group().by(bothE().count()).by('name')

    ==>[1:[vadas, ripple, peteby(),是一步虚拟的操作,一般用于通过条件分组查询。, lop, josh]]

    3.例三 查询所有顶点,通过边的数量分组查询每组的数量

    gremlin> g.V().group().by(bothE().count()).by(count())

    ==>[1:3, 3:3]

     

    九、Cap Step

     

    十、Coalesce Step

     

    十一、Count Step

    count(),统计遍历总数。

    1.例一 统计所有顶点的总数

    gremlin> g.V().count()

    ==>6

    2.例二 统计所有顶点中label为person的总数

    gremlin> g.V().hasLabel('person').count()

    ==>4

    3.例三 查询顶点label值为person的输出边为created的数量,返回查询路径。

    gremlin> g.V().hasLabel('person').outE('created').count().path()

    ==>[4]

    4.例四 查询顶点label值为person的输出边为created的数量,遍历其内容 乘10返回路径。

    gremlin> g.V().hasLabel('person').outE('created').count().map {it.get() * 10}.path()

    ==>[4, 40]

     

    十二、Choose Step

    choose()步骤,类似于if-else的步骤,判断条件走不同的路径。

    1.例一 查找所有顶点中label为person的顶点,如果属性age小于30,查找入边的顶点,否则查找出边的顶点。

    (顶点1age小于30没有入边无结果,顶点4age大于30查找出边顶点为3:name=lop和5:name=ripple)

    gremlin> g.V().hasLabel('person').choose(values('age').is(lte(30)),__.in(),__.out()).values('name')

    ==>marko

    ==>ripple

    ==>lop

    ==>lop

    2.例二 查找所有顶点中label为person的顶点,如果age为27则输出该顶点的入边顶点,如果age为32则输出该顶点的出边顶点。

    (顶点2age为27,入边的顶点为1:name=marko,顶点4age为32,出边的顶点为3:name=lop,5:name=ripple)

    gremlin>g.V().hasLabel('person').choose(values('age')).option(27,__.in()).option(32,__.out()).values('name')

    ==>marko

    ==>ripple

    ==>lop

     

    十三、Coin Step

     

    十四、Constant Step

    constant()步骤,定义成常量。

    1.例一 查询所有顶点,如果label名为person则返回名字,否则返回常量名为inhuman。

    gremlin> g.V().choose(hasLabel('person'),values('name'),constant('inhuman'))

    ==>marko

    ==>vadas

    ==>inhuman

    ==>josh

    ==>inhuman

    ==>peter

     

    十五、CyclicPath Step

     

    十六、Dedup Step

    dedup()步骤,过滤重复数据。

    1. 例一 查询所有名为lang的顶点。dedup()过滤到重复的数据。

    gremlin> g.V().values('lang')

    ==>java

    ==>java

    gremlin> g.V().values('lang').dedup()

    ==>java

     

    十七、Drop Step

    drop()步骤,删除指定的元素或属性。

    1. 例一 查询所有顶点中属性名为name并删除,遍历查询所有的顶点(name的属性已被删除)

    gremlin> g.V().properties('name').drop()

    gremlin> g.V().valueMap()

    ==>[age:[29]]

    ==>[age:[27]]

    ==>[lang:[java]]

    ==>[age:[32]]

    ==>[lang:[java]]

    ==>[age:[35]]

    2.例二 查询并删除所有顶点(查询最后结果为空)

    gremlin> g.V().drop()

    gremlin> g.V()

     

    十八、Explain Step

    好像是用来解释的,没什么实质的作用

     

    十九、Fold Step

    fold()遍历所有的对象,并把他们聚合在一起。

    1. 例一:查询顶点1出边为knows的name值,fold()聚合在一起为一个数组。

    gremlin> g.V(1).out('knows').values('name')

    ==>vadas

    ==>josh

    gremlin> g.V(1).out('knows').values('name').fold()

    ==>[vadas, josh]

     

    二十、Graph Step

    V()步骤通常用于启动一个图形遍历,但也可以用于中间遍历。

    1.例一 查找所有顶点name为marko,vadas或josh命名为person,再次查询所有顶点中name为lop或ripple,增加名为uses的边,从person发出。

    gremlin> g.V().has('name', within('marko', 'vadas', 'josh')).as('person').V().has('name', within('lop', 'ripple')).addE('uses').from('person')

    ==>e[12][1-uses->3]

    ==>e[13][1-uses->5]

    ==>e[14][2-uses->3]

    ==>e[15][2-uses->5]

    ==>e[16][4-uses->3]

    ==>e[17][4-uses->5]

     

    二十一、Group Step

    group()步骤主要用于分组。

    1.例一 通过顶点的label值对顶点进行分类

    gremlin> g.V().group().by(label)

    ==>[software:[v[3], v[5]], person:[v[1], v[2], v[4], v[6]]]

    2.例二 通过顶点的label值对顶点进行分类,获得他们的姓名。

    gremlin> g.V().group().by(label).by('name')

    ==>[software:[lop, ripple], person:[marko, vadas, josh, peter]]

    3.例三 通过顶点的label数量进行分类。

    gremlin> g.V().group().by(label).by(count())

    ==>[software:2, person:4]

     

    二十二、GroupCount Step

    groupCount()步骤主要用于统计分组后的数量。

    1.例一 通过顶点的label值对顶点进行分类

    主要用于统计分组

    1.例一 查询顶点label为person的年龄分布情况。

    gremlin> g.V().hasLabel('person').values('age').groupCount()

    ==>[32:1, 35:1, 27:1, 29:1]

    2.例二 同例一

    gremlin> g.V().hasLabel('person').groupCount().by('age')

    ==>[32:1, 35:1, 27:1, 29:1]

     

    二十三、Has Step

    has() 作用可以过滤顶点,过滤边以及过滤属性。

    例如:

        has(key,value): 删除没有提供的键值对属性。

        has(key,predicate): 删除没有提供的键值。

        hasLabel(labels...): 删除没有对应label属性的内容。

        hasId(ids...): 删除没有对应id属性的内容。

        has(key): 删除没有该健的值的内容。

        hasNot(key): 删除有对应健的内容。

        has(key, traversal)  : 遍历没有结果的则删除。

    1.例一 查询所有顶点中label为person的顶点。

    gremlin> g.V().hasLabel('person')

    ==>v[1]

    ==>v[2]

    ==>v[4]

    ==>v[6]

    2.例二 查询所有顶点中label为person的输出的顶点,并且name=vadas或josh。

    gremlin> g.V().hasLabel('person').out().has('name',within('vadas','josh'))

    ==>v[2]

    ==>v[4]

    3.例三 查询所有顶点中label为person的输出的顶点,并且name=vadas或josh,输出边label为created的边。

    gremlin> g.V().hasLabel('person').out().has('name',within('vadas','josh')).outE().hasLabel('created')

    ==>e[10][4-created->5]

    ==>e[11][4-created->3]

    4.例四 查询所有顶点中年龄在20~30之间的。

    gremlin> g.V().has('age',inside(20,30)).values('age')

    ==>29

    ==>27

    5.例五 查询所有顶点中年龄不在20~30之间的。

    gremlin> g.V().has('age',outside(20,30)).values('age')

    ==>32

    ==>35

    6.例六 查询所有顶点中姓名为josh和marko的并遍历属性。

    gremlin> g.V().has('name',within('josh','marko')).valueMap()

    ==>[name:[marko], age:[29]]

    ==>[name:[josh], age:[32]]

    7.例七 查询所有顶点中姓名不为josh和marko的并遍历属性。

    gremlin> g.V().has('name',without('josh','marko')).valueMap()

    ==>[name:[vadas], age:[27]]

    ==>[name:[lop], lang:[java]]

    ==>[name:[ripple], lang:[java]]

    ==>[name:[peter], age:[35]]

    8.例八 查询所有顶点中姓名不为josh和marko的并遍历属性。

    gremlin> g.V().has('name',not(within('josh','marko'))).valueMap()

    ==>[name:[vadas], age:[27]]

    ==>[name:[lop], lang:[java]]

    ==>[name:[ripple], lang:[java]]

    ==>[name:[peter], age:[35]]

     

    二十五、Is Step

    is()类似于等于的作用。

    1.例一 查询所有顶点中age=32的顶点。

    gremlin> g.V().values('age').is(32)

    ==>32

    2.例二 查询所有顶点中age<30的顶点。

    gremlin> g.V().values('age').is(lte(30))

    ==>29

    ==>27

    3.例三 查询所有顶点中age在30到40之间的顶点。

    gremlin> g.V().values('age').is(inside(30, 40))

    ==>32

    ==>35

    4.例四 查询所有顶点,条件为入边为created并且数量为1,显示name。

    gremlin> g.V().where(__.in('created').count().is(1)).values('name')

    ==>ripple

    5.例五 查询所有顶点,条件为入边为created并且数量大于2,显示name。

    gremlin> g.V().where(__.in('created').count().is(gte(2))).values('name')

    ==>lop

    6.例六 查询所有顶点,平均值在30到35之间。

    gremlin> g.V().where(__.in('created').values('age').mean().is(inside(30d, 35d))).values('name')

    ==>lop

    ==>ripple

     

    二十六、Limit Step

    Limit()的主要作用和Range()类似,主要用于限制最小条数。

    1.例一 查询所有顶点的前两条。

    gremlin> g.V().limit(2)

    ==>v[1]

    ==>v[2]

     

    二十七、Local Step

     

    二十八、Match Step

     

    二十九、Max Step

    Max()的作用查找流中最大的值

    1.例一 两种方式查找age最大的值。

    gremlin> g.V().values('age').max()

    ==>35

    gremlin> g.V().repeat(both()).times(3).values('age').max()

    ==>35

     

    三十、Mean Step

    mean()的主要作用用于求平均值。

    1.例一 查询所有顶点的平均值

    gremlin> g.V().values('age').mean()

    ==>30.75

    2.例二 查询所有顶点,查询三次所有边,计算年龄的平均值

    gremlin> g.V().repeat(both()).times(3).values('age').mean()

    ==>30.645833333333332

    3.例三 查询所有顶点,查询三次所有去重边,计算年龄的平均值

    gremlin> g.V().repeat(both()).times(3).values('age').dedup().mean()

    ==>30.75

     

    三十一、Min Step

    Min()的作用查找流中最小的值

    1.例一 两种方式查找age最小的值。

    gremlin> g.V().values('age').min()

    ==>27

    gremlin> g.V().repeat(both()).times(3).values('age').min()

    ==>27

     

    三十二、Or Step

    or()或者的作用满足条件之一即可返回数据

    1.例一 查找顶点的输出边为created或者输入边为created的数量大于1.

    gremlin> g.V().or(__.outE('created'),__.inE('created').count().is(gt(1))).values('name')

    ==>marko

    ==>lop

    ==>josh

    ==>peter

     

    三十三、Order Step

    order()当需要对遍历流的对象进行排序时,可以利用Order()

    1.例一 查询顶点的姓名并进行排序

    gremlin> g.V().values('name').order()

    ==>josh

    ==>lop

    ==>marko

    ==>peter

    ==>ripple

    ==>vadas

    2.例二 查询顶点的姓名并进行倒序排序

    gremlin> g.V().values('name').order().by(decr)

    ==>vadas

    ==>ripple

    ==>peter

    ==>marko

    ==>lop

    ==>josh

    3.例三 查询label为person的顶点,并使用age进行升序排序,显示其姓名。

    gremlin> g.V().hasLabel('person').order().by('age', incr).values('name')

    ==>vadas

    ==>marko

    ==>josh

    ==>peter

     

    三十四、Path Step


    path()的作用主要用于查询每一步的路径。

    1.例一 查询顶点输出顶点的输出顶点的姓名。

    gremlin> g.V().out().out().values('name')

    ==>ripple

    ==>lop

    1.例一 查询顶点输出顶点的输出顶点的姓名的路径。

    gremlin> g.V().out().out().values('name').path()

    ==>[v[1], v[4], v[5], ripple]

    ==>[v[1], v[4], v[3], lop]

    2.例二 如果边缘在路径中是必须的。

    gremlin> g.V().outE().inV().outE().inV().path()

    ==>[v[1], e[8][1-knows->4], v[4], e[10][4-created->5], v[5]]

    ==>[v[1], e[8][1-knows->4], v[4], e[11][4-created->3], v[3]]

    3.例三 如果by()在路径中是必须的。

    gremlin> g.V().out().out().path().by('name').by('age')

    ==>[marko, 32, ripple]

    ==>[marko, 32, lop]

     

    三十五、Profile Step

    允许配置遍历的信息等。

     

    三十六、Range Step

    range()的主要作用是限制查询的条数

    1.例一 查找所有顶点从下标1的开始查询3条。

    gremlin> g.V().range(1,3)

    ==>v[2]

    ==>v[3]

     

    三十七、Repeat Step

    repeat()用于对给定的条件 进行循环。

    1.例一 查询顶点1的输出顶点的路径循环两次,并显示其名字。

    gremlin> g.V(1).repeat(out()).times(2).path().by('name')

    ==>[marko, josh, ripple]

    ==>[marko, josh, lop]

    2.例二 查询所有顶点输出的顶点路径,显示名字,直到name=ripple时停止。

    gremlin> g.V().until(has('name','ripple')).repeat(out()).path().by('name')

    ==>[marko, josh, ripple]

    ==>[josh, ripple]

    ==>[ripple]

     

    三十八、Sack Step

     

    三十九、Select Step

    select()查询过滤需要显示的内容

    1.例一 所有的顶点为a,输出的顶点为b,再次输出的顶点为c,查询a,b,c。

    gremlin> g.V().as('a').out().as('b').out().as('c').select('a','b','c')

    ==>[a:v[1], b:v[4], c:v[5]]

    ==>[a:v[1], b:v[4], c:v[3]]

    2.例二 所有的顶点为a,输出的顶点为b,再次输出的顶点为c,查询a,b。

    gremlin> g.V().as('a').out().as('b').out().as('c').select('a','b')

    ==>[a:v[1], b:v[4]]

    ==>[a:v[1], b:v[4]]

    3.例三 所有的顶点为a,输出的顶点为b,再次输出的顶点为c,查询a,b并返回姓名。

    gremlin> g.V().as('a').out().as('b').out().as('c').select('a','b').by('name')

    ==>[a:marko, b:josh]

    ==>[a:marko, b:josh]

     

    四十、SimplePath Step

    simplePath()作用为过滤重复路径。

    1.例一 查询顶点1的所有相邻顶点(2,3,4),再次查询相邻的顶点(1,1,4,6,3,5,1)

    gremlin> g.V(1).both().both()

    ==>v[1]

    ==>v[4]

    ==>v[6]

    ==>v[1]

    ==>v[5]

    ==>v[3]

    ==>v[1]

    2.例二 查询顶点1的所有相邻顶点(2,3,4),再次查询相邻的顶点(1,1,4,6,3,5,1),过滤重复路径。

    gremlin> g.V(1).both().both().simplePath()

    ==>v[4]

    ==>v[6]

    ==>v[5]

    ==>v[3]

    3.例三 查询顶点1的所有相邻顶点(2,3,4),再次查询相邻的顶点(1,1,4,6,3,5,1),过滤重复路径的路径查看。

    gremlin> g.V(1).both().both().simplePath().path()

    ==>[v[1], v[3], v[4]]

    ==>[v[1], v[3], v[6]]

    ==>[v[1], v[4], v[5]]

    ==>[v[1], v[4], v[3]]

     

    四十一、Store Step

     

    四十二、Subgraph Step

    用于提取一部分子图用于分析。

     

    四十三、Sum Step

    sum()作用查询条件的总和

    1.例一 查询所有顶点中age的总和

    gremlin> g.V().values('age').sum()

    ==>123

    2.例二 查询所有顶点中所有边的时间的年龄之和

    gremlin> g.V().repeat(both()).times(3).values('age').sum()

    ==>1471

     

    四十四、Tail Step

    tail()类似于limit()倒着获取结果集的内容。

    1.例一 获取顶点中最后一条记录的名称。

    gremlin> g.V().values('name').order().tail()

    ==>vadas

    2.例二 获取顶点中最后一条记录的名称。

    gremlin> g.V().values('name').order().tail(1)

    ==>vadas

    3.例三 获取顶点中倒数三条记录的名称。

    gremlin> g.V().values('name').order().tail(3)

    ==>peter

    ==>ripple

    ==>vadas

     

    四十五、TimeLimit Step

     

    四十六、Tree Step

     

    四十七、Unfold Step

    unfold()是fold()的反向形式,将放入数组的内容拆分出来。

    1.例一 查询顶点1的输出顶点的集合,并增加gremlin和[1.23,2.34]的内容。

    gremlin> g.V(1).out().fold().inject('gremlin',[1.23,2.34])

    ==>gremlin

    ==>[1.23, 2.34]

    ==>[v[3], v[2], v[4]]

    2.例二 查询顶点1的输出顶点的集合,并增加gremlin和[1.23,2.34]的内容拆分出来。

    gremlin> g.V(1).out().fold().inject('gremlin',[1.23,2.34]).unfold()

    ==>gremlin

    ==>1.23

    ==>2.34

    ==>v[3]

    ==>v[2]

    ==>v[4]

     

    四十八、Union Step

    union()支持任意数量的遍历结果的合并的结果集。

    1.例一 查询顶点4的入点的年龄值和出点的lang值。

    gremlin> g.V(4).union(__.in().values('age'),out().values('lang'))

    ==>29

    ==>java

    ==>java

    2.例二 查询顶点4的入点的年龄值和出点的lang值的路径。

    gremlin> g.V(4).union(__.in().values('age'),out().values('lang')).path()

    ==>[v[4], v[1], 29]

    ==>[v[4], v[5], java]

    ==>[v[4], v[3], java]

     

    四十九、ValueMap Step

    valueMap()映射元素的属性表示。

    1.例一 查询所有顶点的属性。

    gremlin> g.V().valueMap()

    ==>[name:[marko], age:[29]]

    ==>[name:[vadas], age:[27]]

    ==>[name:[lop], lang:[java]]

    ==>[name:[josh], age:[32]]

    ==>[name:[ripple], lang:[java]]

    ==>[name:[peter], age:[35]]

    2.例二 查询所有顶点的属性age的结果。

    gremlin> g.V().valueMap('age')

    ==>[age:[29]]

    ==>[age:[27]]

    ==>[:]

    ==>[age:[32]]

    ==>[:]

    ==>[age:[35]]

    3.例三 查询顶点的属性为age和blah的结果集。

    gremlin> g.V().valueMap('age','blah')

    ==>[age:[29]]

    ==>[age:[27]]

    ==>[:]

    ==>[age:[32]]

    ==>[:]

    ==>[age:[35]]

    4.例四 查询所有边的属性值。

    gremlin> g.E().valueMap()

    ==>[weight:0.5]

    ==>[weight:1.0]

    ==>[weight:0.4]

    ==>[weight:1.0]

    ==>[weight:0.4]

    ==>[weight:0.2]

     

    五十、Vertex Step

    点是gremlin的基础。通过这些步骤,它可以在图“-”即“遍历”上“移动”。

        out(string...): 移动到边缘标签输出的相邻顶点。

        in(string...): 移动到边缘标签输出的相邻顶点。

        both(string...): 移动到两个传入和传出相邻顶点给边缘标签。

     

            outE(string...): 移动到输出的边上。

            inE(string...): 移动到输入的边上。

            bothE(string...): 移动到输出和输入边上。

    //与out()的区别在于out()以顶点为基准,而outV()以边为基准

        outV(): 移动到输出的顶点上。

        inV(): 移动到输入的顶点上。

        bothV(): 移动到输出和输入的顶点上。

        otherV() : 移动到不是被移动的顶点的顶点。

    1.查询顶点4的边中为know,created和blah的边上。

    gremlin> g.V(4).bothE('knows','created','blah')

    ==>e[10][4-created->5]

    ==>e[11][4-created->3]

    ==>e[8][1-knows->4]

    2.查询顶点4的边中为know,created和blah的边上其余点上。

    gremlin> g.V(4).bothE('knows','created','blah').otherV()

    ==>v[5]

    ==>v[3]

    ==>v[1]

     

    五十一、Where Step

    where()主要用于过滤条件的工作。

    1.例一 顶点1命名为a,查找输出边为created的顶点,再次查找输入边为created的顶点,返回出去a的顶点。

    gremlin> g.V(1).as('a').out('created').in('created').where(neq('a'))

    ==>v[4]

    ==>v[6]

    2.例二 没理解withSideEffect的意思

    gremlin> g.withSideEffect('a',['josh','peter']).V(1).out('created').in('created').values('name').where(within('a'))

    ==>josh

    ==>peter

    3.例三 查询顶点1输出边为created的顶点,再次查找输入边为created的顶点,返回最后查找出来顶点的输出边为created的数量大于1的name。

    gremlin> g.V(1).out('created').in('created').where(out('created').count().is(gt(1))).values('name')

    ==>josh

     

    五十二、Inject Step

    Inject()插入的作用,使得可以任意地将对象插入到遍历流中。

    1.例一 查询第四个顶点的输出顶点的姓名,并插入一个姓名为daniel。

    gremlin> g.V(4).out().values('name').inject('daniel')

    ==>daniel

    ==>ripple

    ==>lop

    2.例二 询第四个顶点的输出顶点的姓名,并插入一个姓名为daniel。map遍历每个元素的长度。

    gremlin> g.V(4).out().values('name').inject('daniel').map {it.get().length()}

    ==>6

    ==>6

    ==>3

    3.例三 询第四个顶点的输出顶点的姓名,并插入一个姓名为daniel。map遍历每个元素的长度的路径。

    gremlin> g.V(4).out().values('name').inject('daniel').map {it.get().length()}.path()

    ==>[daniel, 6]

    ==>[v[4], v[5], ripple, 6]

    ==>[v[4], v[3], lop, 3]

     

    五十三、Sample Step

    sample 查询一些有用的遍历信息

    1.例一 查询顶点输出边的weight值.

    gremlin> g.V().outE().sample(1).values('weight')

    ==>0.4

    2.例二 查询顶点输出边的weight值,通过weight返回一个结果.

    gremlin> g.V().outE().sample(1).by('weight').values('weight')

    ==>1.0

    3.例三 查询顶点输出边的weight值,通过weight返回两个结果.

    gremlin> g.V().outE().sample(2).by('weight').values('weight')

    ==>1.0

    ==>0.5


     

    展开全文
  • gremlin语句详解

    万次阅读 2018-07-03 17:52:00
    到了新公司用到了tinkerPop的gremlin语句,由于是全英文的文档。为了杜绝我鱼记忆,决定整理一下以后查看方便。嗯嗯~ o(* ̄▽ ̄*)o附图:语句来源于图片初步认识:点:蓝色的圈代表顶点(查询语句中的V()),圈中的...

    到了新公司用到了tinkerPop的gremlin语句,由于是全英文的文档。为了杜绝我鱼记忆,决定整理一下以后查看方便。嗯嗯~ o(* ̄▽ ̄*)o

    附图:语句来源于图片


    初步认识:

    点:蓝色的圈代表顶点(查询语句中的V()),圈中的person代表顶点的名称,name和age为顶点的属性。

    边:黑色的线代表边(查询语句中的E()),线上的knows代表边的名称,weight为边的属性。

    一、Lambda Step

    四个基础的步骤:map ,flatMap ,filter,sideEffect,branch

    1. 查找节点属性

    (1). V(1)=查询图中第一个顶点  .out() = 输出的顶点  .values("name") = 属性为name的值 

    (查询第一个顶点所有边中向外指的顶点,返回这些顶点的name的值)

    gremlin> g.V(1).out().values('name')

    ==>lop

    ==>vadas

    ==>josh

    (2).返回相同的数据使用map的方式

    gremlin> g.V(1).out().map {it.get().value('name')}

    ==>lop

    ==>vadas

    ==>josh

    2. has has的用法类似于过滤器的作用

    (1).查找所有顶点中label边的值为person的(默认返回节点信息)

    gremlin> g.V().hasLabel('person')

    ==>v[1]

    ==>v[2]

    ==>v[4]

    ==>v[6]

    (2).使用过滤器filter的方式查找

    gremlin> g.V().filter {it.get().label() == 'person'}

    ==>v[1]

    ==>v[2]

    ==>v[4]

    ==>v[6]

    3. 进入sideEffect() 的任何内容都被传递到下一个步骤,但可能会发生一些中间过程。

    gremlin> g.V().hasLabel('person').sideEffect(System.out.&println)

    v[1]

    ==>v[1]

    v[2]

    ==>v[2]

    v[4]

    ==>v[4]

    v[6]

    ==>v[6]

    4.choose()和branch()

    解释:返回顶点的姓名,如果姓名为marko则返回年龄,其他的返回姓名。

    gremlin> g.V().branch(values('name')).option('marko', values('age')).option(none, values('name'))

    ==>29

    ==>vadas

    ==>lop

    ==>josh

    ==>ripple

    ==>peter

    gremlin> g.V().choose(has('name','marko'),values('age'),values('name'))

    ==>29

    ==>vadas

    ==>lop

    ==>josh

    ==>ripple

    ==>peter

    二、AddEdge Step

    此部分的主要功能是为已有的图形添加新的边。


    1.addE()例一 以上图为例

    解释:第一个顶点命名为a,查找出边为created的点(3),再次查找入边为created的点,并且这个点不是a,添加一条边,边的名称为co-developer,从a发出属性为:year,2009.

    gremlin> g.V(1).as('a').out('created').in('created').where(neq('a')).addE('co-developer').from('a').property('year',2009)

    ==>e[12][1-co-developer->4]

    ==>e[13][1-co-developer->6]

    2.addE()例二 敲打

    gremlin> g.V(3,4,5).aggregate('x').has('name','josh').as('a').select('x').unfold().hasLabel('software').addE('createdBy').to('a')

    ==>e[14][3-createdBy->4]

    ==>e[15][5-createdBy->4]

    3.addE()例三

    解释:所有顶点为a,查找出边为created的顶点(3),增加边名称为createdBy,新增的边出点为a,属性名为acl,public。

    gremlin> g.V().as('a').out('created').addE('createdBy').to('a').property('acl','public')

    ==>e[16][3-createdBy->1]

    ==>e[17][5-createdBy->4]

    ==>e[18][3-createdBy->4]

    ==>e[19][3-createdBy->6]

    4.addE()例四 敲打

    gremlin> g.V(1).as('a').out('knows').addE('livesNear').from('a').property('year',2009).inV().inE('livesNear').values('year')

    ==>2009

    ==>2009

    5.addE()例五 敲打

    gremlin> g.V().match(__.as('a').out('knows').as('b'),__.as('a').out('created').as('c'),__.as('b').out('created').as('c')).addE('friendlyCollaborator').from('a').to('b').property(id,13).property('project',select('c').values('name'))

    ==>e[13][1-friendlyCollaborator->4]

    三、AddVertex Step

    addE()例五 这个过程是用户给图形增加顶点,对于每一个传入对象,都创建一个顶点。此外,GraveTraceSaleStand维护了一个addV()方法。

    1.例一 新增一个顶点person,属性为name=stephen。

    gremlin> g.addV('person').property('name','stephen')

    ==>v[12]

    2.例二 查看所有顶点的name

    gremlin> g.V().values('name')

    ==>marko

    ==>vadas

    ==>lop

    ==>josh

    ==>ripple

    ==>peter

    ==>stephen

    3.例三 所有顶点出边为knows,新增顶点,属性名为name=nothing。

    gremlin> g.V().outE('knows').addV().property('name','nothing')

    ==>v[14]

    ==>v[16]

    4.例四 查看所有顶点中name=nothing的id

    gremlin> g.V().has('name','nothing')

    ==>v[16]

    ==>v[14]

    四、AddProperty Step

    addProperty()用户给图中的对象增加属性。不同于addV()和addE()

    1.例一 给顶点1创建属性country=usa

    gremlin> g.V(1).property('country','usa')

    ==>v[1]

    2.例二 给顶点1创建属性city=sanfa fe,state=new mexico并返回所有属性名。

    gremlin> g.V(1).property('city','santa fe').property('state','new mexico').valueMap()

    ==>[country:[usa], city:[santa fe], name:[marko], state:[new mexico], age:[29]]

    3.例三 给顶点1创建属性age=35

    gremlin> g.V(1).property(list,'age',35)

    ==>v[1]

    4.例四 返回顶点1的所有属性值

    gremlin> g.V(1).valueMap()

    ==>[country:[usa], city:[santa fe], name:[marko], state:[new mexico], age:[29, 35]]

    5.例五 给顶点1增加属性friendWeight输出边为knows的值为weight之和,属性为ac=private

    gremlin> g.V(1).property('friendWeight',outE('knows').values('weight').sum(),'acl','private')

    ==>v[1]

    6.例六 查询顶点1的friendWeight的属性。

    gremlin> g.V(1).properties('friendWeight').valueMap()

    ==>[acl:private]

    五、Aggregate Step

    aggregte()用于遍历所有特定的对象集合在一起。

    1.例一

    查找顶点1输出边是created的点(3)

    gremlin> g.V( 1 ).out( 'created' )

    ==>v[3]

    将所有顶点1输出边为created的顶点聚合为x

    gremlin> g.V(1).out('created').aggregate('x')

    ==>v[3]

    查找所有顶点1输出边为created的顶点(3),再查找输入边为created的所有顶点

    gremlin> g.V(1).out('created').aggregate('x').in('created')

    ==>v[1]

    ==>v[4]

    ==>v[6]

    查找所有顶点1输出边为created的顶点(3),再查找输入边为created的所有顶点,再查找输出边为created的顶点

    gremlin> g.V(1).out('created').aggregate('x').in('created').out('created')

    ==>v[3]

    ==>v[5]

    ==>v[3]

    ==>v[3]

    查找所有顶点1输出边为created的顶点(3),再查找输入边为created的所有顶点,再查找输出边为created的顶点。过滤所有x(x = 顶点1输出边为created的顶点 = 3)的集合并输出name值。

    gremlin> g.V(1).out('created').aggregate('x').in('created').out('created').where(without('x')).values('name')

    ==>ripple

    六、And Step

    and()同时满足and()要求的条件并输出。

    1.例一 满足两个条件1.g.V().outE('knows') 2.g.V().values('age').is(lt(30))的名字

    gremlin> g.V().and(outE('knows'),values('age').is(lt(30))).values('name')

    ==>marko

    七、As Step

    as(),是一步虚拟的操作,类似于by()和option().

    1.例一 所有顶点命名为a,输出边为created的顶点命名为b,查询a和b。

    gremlin> g.V().as('a').out('created').as('b').select('a','b')

    ==>[a:v[1], b:v[3]]

    ==>[a:v[4], b:v[5]]

    ==>[a:v[4], b:v[3]]

    ==>[a:v[6], b:v[3]]

    八、By Step

    by(),是一步虚拟的操作,一般用于通过条件分组查询。

    1.例一 查询所有顶点,通过边的数量分组查询数量

    gremlin> g.V().group().by(bothE().count())

    ==>[1:[v[2], v[5], v[6]], 3:[v[1], v[3], v[4]]]

    2.例二 查询所有顶点,通过边的数量分组查询姓名

    gremlin> g.V().group().by(bothE().count()).by('name')

    ==>[1:[vadas, ripple, peteby(),是一步虚拟的操作,一般用于通过条件分组查询。, lop, josh]]

    3.例三 查询所有顶点,通过边的数量分组查询每组的数量

    gremlin> g.V().group().by(bothE().count()).by(count())

    ==>[1:3, 3:3]

    九、Cap Step

    十、Coalesce Step

    by(),是一步虚拟的操作,一般用于通过条件分组查询。

    十一、Count Step

    count(),统计遍历总数。

    1.例一 统计所有顶点的总数

    gremlin> g.V().count()

    ==>6

    2.例二 统计所有顶点中label为person的总数

    gremlin> g.V().hasLabel('person').count()

    ==>4

    3.例三 查询顶点label值为person的输出边为created的数量,返回查询路径。

    gremlin> g.V().hasLabel('person').outE('created').count().path()

    ==>[4]

    4.例四 查询顶点label值为person的输出边为created的数量,遍历其内容 乘10返回路径。

    gremlin> g.V().hasLabel('person').outE('created').count().map {it.get() * 10}.path()

    ==>[4, 40]

    十二、Choose Step

    choose()步骤,类似于if-else的步骤,判断条件走不同的路径。

    1.例一 查找所有顶点中label为person的顶点,如果属性age小于30,查找入边的顶点,否则查找出边的顶点。

    (顶点1age小于30没有入边无结果,顶点4age大于30查找出边顶点为3:name=lop和5:name=ripple)

    gremlin> g.V().hasLabel('person').choose(values('age').is(lte(30)),__.in(),__.out()).values('name')

    ==>marko

    ==>ripple

    ==>lop

    ==>lop

    2.例二 查找所有顶点中label为person的顶点,如果age为27则输出该顶点的入边顶点,如果age为32则输出该顶点的出边顶点。

    (顶点2age为27,入边的顶点为1:name=marko,顶点4age为32,出边的顶点为3:name=lop,5:name=ripple)

    gremlin>g.V().hasLabel('person').choose(values('age')).option(27,__.in()).option(32,__.out()).values('name')

    ==>marko

    ==>ripple

    ==>lop

    十三、Coin Step

    十四、Constant Step

    constant()步骤,定义成常量。

    1.例一 查询所有顶点,如果label名为person则返回名字,否则返回常量名为inhuman。

    gremlin> g.V().choose(hasLabel('person'),values('name'),constant('inhuman'))

    ==>marko

    ==>vadas

    ==>inhuman

    ==>josh

    ==>inhuman

    ==>peter

    十五、CyclicPath Step

    十六、Dedup Step

    dedup()步骤,过滤重复数据。

    1. 例一 查询所有名为lang的顶点。dedup()过滤到重复的数据。

    gremlin> g.V().values('lang')

    ==>java

    ==>java

    gremlin> g.V().values('lang').dedup()

    ==>java

    十七、Drop Step

    drop()步骤,删除指定的元素或属性。

    1. 例一 查询所有顶点中属性名为name并删除,遍历查询所有的顶点(name的属性已被删除)

    gremlin> g.V().properties('name').drop()

    gremlin> g.V().valueMap()

    ==>[age:[29]]

    ==>[age:[27]]

    ==>[lang:[java]]

    ==>[age:[32]]

    ==>[lang:[java]]

    ==>[age:[35]]

    2.例二 查询并删除所有顶点(查询最后结果为空)

    gremlin> g.V().drop()

    gremlin> g.V()

    十八、Explain Step

    好像是用来解释的,没什么实质的作用

    十九、Fold Step

    fold()遍历所有的对象,并把他们聚合在一起。

    1. 例一:查询顶点1出边为knows的name值,fold()聚合在一起为一个数组。

    gremlin> g.V(1).out('knows').values('name')

    ==>vadas

    ==>josh

    gremlin> g.V(1).out('knows').values('name').fold()

    ==>[vadas, josh]

    二十、Graph Step

    V-()步骤通常用于启动一个图形遍历,但也可以用于中间遍历。

    1.例一 查找所有顶点name为marko,vadas或josh命名为person,再次查询所有顶点中name为lop或ripple,增加名为uses的边,从person发出。

    gremlin> g.V().has('name', within('marko', 'vadas', 'josh')).as('person').V().has('name', within('lop', 'ripple')).addE('uses').from('person')

    ==>e[12][1-uses->3]

    ==>e[13][1-uses->5]

    ==>e[14][2-uses->3]

    ==>e[15][2-uses->5]

    ==>e[16][4-uses->3]

    ==>e[17][4-uses->5]

    二十一、Group Step

    group()步骤主要用于分组。

    1.例一 通过顶点的label值对顶点进行分类

    gremlin> g.V().group().by(label)

    ==>[software:[v[3], v[5]], person:[v[1], v[2], v[4], v[6]]]

    2.例二 通过顶点的label值对顶点进行分类,获得他们的姓名。

    gremlin> g.V().group().by(label).by('name')

    ==>[software:[lop, ripple], person:[marko, vadas, josh, peter]]

    3.例三 通过顶点的label数量进行分类。

    gremlin> g.V().group().by(label).by(count())

    ==>[software:2, person:4]

    二十二、GroupCount Step

    groupCount()步骤主要用于统计分组后的数量。

    1.例一 通过顶点的label值对顶点进行分类

    主要用于统计分组

    1.例一 查询顶点label为person的年龄分布情况。

    gremlin> g.V().hasLabel('person').values('age').groupCount()

    ==>[32:1, 35:1, 27:1, 29:1]

    2.例二 同例一

    gremlin> g.V().hasLabel('person').groupCount().by('age')

    ==>[32:1, 35:1, 27:1, 29:1]

    二十三、Has Step

    has() 作用可以过滤顶点,过滤边以及过滤属性。

    例如:

    • has(key,value): 删除没有提供的键值对属性。

    • has(key,predicate): 删除没有提供的键值。

    • hasLabel(labels...): 删除没有对应label属性的内容。

    • hasId(ids...): 删除没有对应id属性的内容。

    • has(key): 删除没有该健的值的内容。

    • hasNot(key): 删除有对应健的内容。

    • has(key, traversal)  : 遍历没有结果的则删除

    1.例一 查询所有顶点中label为person的顶点。

    gremlin> g.V().hasLabel('person')

    ==>v[1]

    ==>v[2]

    ==>v[4]

    ==>v[6]

    2.例二 查询所有顶点中label为person的输出的顶点,并且name=vadas或josh。

    gremlin> g.V().hasLabel('person').out().has('name',within('vadas','josh'))

    ==>v[2]

    ==>v[4]

    3.例三 查询所有顶点中label为person的输出的顶点,并且name=vadas或josh,输出边label为created的边。

    gremlin> g.V().hasLabel('person').out().has('name',within('vadas','josh')).outE().hasLabel('created')

    ==>e[10][4-created->5]

    ==>e[11][4-created->3]

    4.例四 查询所有顶点中年龄在20~30之间的。

    gremlin> g.V().has('age',inside(20,30)).values('age')

    ==>29

    ==>27

    5.例五 查询所有顶点中年龄不在20~30之间的。

    gremlin> g.V().has('age',outside(20,30)).values('age')

    ==>32

    ==>35

    6.例六 查询所有顶点中姓名为josh和marko的并遍历属性。

    gremlin> g.V().has('name',within('josh','marko')).valueMap()

    ==>[name:[marko], age:[29]]

    ==>[name:[josh], age:[32]]

    7.例七 查询所有顶点中姓名不为josh和marko的并遍历属性

    gremlin> g.V().has('name',without('josh','marko')).valueMap()

    ==>[name:[vadas], age:[27]]

    ==>[name:[lop], lang:[java]]

    ==>[name:[ripple], lang:[java]]

    ==>[name:[peter], age:[35]]

    8.例八 查询所有顶点中姓名不为josh和marko的并遍历属性

    gremlin> g.V().has('name',not(within('josh','marko'))).valueMap()

    ==>[name:[vadas], age:[27]]

    ==>[name:[lop], lang:[java]]

    ==>[name:[ripple], lang:[java]]

    ==>[name:[peter], age:[35]]

    二十五、Is Step

    is()类似于等于的作用。

    1.例一 查询所有顶点中age=32的顶点。

    gremlin> g.V().values('age').is(32)

    ==>32

    2.例二 查询所有顶点中age<30的顶点。

    gremlin> g.V().values('age').is(lte(30))

    ==>29

    ==>27

    3.例三 查询所有顶点中age在30到40之间的顶点。

    gremlin> g.V().values('age').is(inside(30, 40))

    ==>32

    ==>35

    4.例四 查询所有顶点,条件为入边为created并且数量为1,显示name。

    gremlin> g.V().where(__.in('created').count().is(1)).values('name')

    ==>ripple

    5.例五 查询所有顶点,条件为入边为created并且数量大于2,显示name。

    gremlin> g.V().where(__.in('created').count().is(gte(2))).values('name')

    ==>lop

    6.例六 查询所有顶点,平均值在30到35之间。

    gremlin> g.V().where(__.in('created').values('age').mean().is(inside(30d, 35d))).values('name')

    ==>lop

    ==>ripple

    二十六、Limit Step

    Limit()的主要作用和Range()类似,主要用于限制最小条数。

    1.例一 查询所有顶点的前两条。

    gremlin> g.V().limit(2)

    ==>v[1]

    ==>v[2]

    二十七、Local Step

    二十八、Match Step

    二十九、Max Step

    Max()的作用查找流中最大的值

    1.例一 两种方式查找age最大的值。

    gremlin> g.V().values('age').max()

    ==>35

    gremlin> g.V().repeat(both()).times(3).values('age').max()

    ==>35

    三十、Mean Step

    mean()的主要作用用于求平均值。

    1.例一 查询所有顶点的平均值

    gremlin> g.V().values('age').mean()

    ==>30.75

    2.例二 查询所有顶点,查询三次所有边,计算年龄的平均值

    gremlin> g.V().repeat(both()).times(3).values('age').mean()

    ==>30.645833333333332

    3.例三 查询所有顶点,查询三次所有去重边,计算年龄的平均值

    gremlin> g.V().repeat(both()).times(3).values('age').dedup().mean()

    ==>30.75

    三十一、Min Step

    Min()的作用查找流中最小的值

    1.例一 两种方式查找age最小的值。

    gremlin> g.V().values('age').min()

    ==>27

    gremlin> g.V().repeat(both()).times(3).values('age').min()

    ==>27

    三十二、Or Step

    or()或者的作用满足条件之一即可返回数据

    1.例一 查找顶点的输出边为created或者输入边为created的数量大于1.

    gremlin> g.V().or(__.outE('created'),__.inE('created').count().is(gt(1))).values('name')

    ==>marko

    ==>lop

    ==>josh

    ==>peter

    三十三、Order Step

    order()当需要对遍历流的对象进行排序时,可以利用Order()

    1.例一 查询顶点的姓名并进行排序

    gremlin> g.V().values('name').order()

    ==>josh

    ==>lop

    ==>marko

    ==>peter

    ==>ripple

    ==>vadas

    2.例二 查询顶点的姓名并进行倒序排序

    gremlin> g.V().values('name').order().by(decr)

    ==>vadas

    ==>ripple

    ==>peter

    ==>marko

    ==>lop

    ==>josh

    3.例三 查询label为person的顶点,并使用age进行升序排序,显示其姓名。

    gremlin> g.V().hasLabel('person').order().by('age', incr).values('name')

    ==>vadas

    ==>marko

    ==>josh

    ==>peter

    三十四、Path Step


    path()的作用主要用于查询每一步的路径。

    1.例一 查询顶点输出顶点的输出顶点的姓名。

    gremlin> g.V().out().out().values('name')

    ==>ripple

    ==>lop

    1.例一 查询顶点输出顶点的输出顶点的姓名的路径。

    gremlin> g.V().out().out().values('name').path()

    ==>[v[1], v[4], v[5], ripple]

    ==>[v[1], v[4], v[3], lop]

    2.例二 如果边缘在路径中是必须的。

    gremlin> g.V().outE().inV().outE().inV().path()

    ==>[v[1], e[8][1-knows->4], v[4], e[10][4-created->5], v[5]]

    ==>[v[1], e[8][1-knows->4], v[4], e[11][4-created->3], v[3]]

    3.例三 如果by()在路径中是必须的。

    gremlin> g.V().out().out().path().by('name').by('age')

    ==>[marko, 32, ripple]

    ==>[marko, 32, lop]

    三十五、Profile Step

    允许配置遍历的信息等。

    三十六、Range Step

    range()的主要作用是限制查询的条数

    1.例一 查找所有顶点从下标1的开始查询3条。

    gremlin> g.V().range(1,3)

    ==>v[2]

    ==>v[3]

    三十七、Repeat Step

    repeat()用于对给定的条件 进行循环。

    1.例一 查询顶点1的输出顶点的路径循环两次,并显示其名字。

    gremlin> g.V(1).repeat(out()).times(2).path().by('name')

    ==>[marko, josh, ripple]

    ==>[marko, josh, lop]

    2.例二 查询所有顶点输出的顶点路径,显示名字,直到name=ripple时停止。

    gremlin> g.V().until(has('name','ripple')).repeat(out()).path().by('name')

    ==>[marko, josh, ripple]

    ==>[josh, ripple]

    ==>[ripple]

    三十八、Sack Step

    三十九、Select Step

    select()查询过滤需要显示的内容

    1.例一 所有的顶点为a,输出的顶点为b,再次输出的顶点为c,查询a,b,c。

    gremlin> g.V().as('a').out().as('b').out().as('c').select('a','b','c')

    ==>[a:v[1], b:v[4], c:v[5]]

    ==>[a:v[1], b:v[4], c:v[3]]

    2.例二 所有的顶点为a,输出的顶点为b,再次输出的顶点为c,查询a,b。

    gremlin> g.V().as('a').out().as('b').out().as('c').select('a','b')

    ==>[a:v[1], b:v[4]]

    ==>[a:v[1], b:v[4]]

    3.例三 所有的顶点为a,输出的顶点为b,再次输出的顶点为c,查询a,b并返回姓名。

    gremlin> g.V().as('a').out().as('b').out().as('c').select('a','b').by('name')

    ==>[a:marko, b:josh]

    ==>[a:marko, b:josh]

    四十、SimplePath Step

    simplePath()作用为过滤重复路径。

    1.例一 查询顶点1的所有相邻顶点(2,3,4),再次查询相邻的顶点(1,1,4,6,3,5,1)

    gremlin> g.V(1).both().both()

    ==>v[1]

    ==>v[4]

    ==>v[6]

    ==>v[1]

    ==>v[5]

    ==>v[3]

    ==>v[1]

    2.例二 查询顶点1的所有相邻顶点(2,3,4),再次查询相邻的顶点(1,1,4,6,3,5,1),过滤重复路径。

    gremlin> g.V(1).both().both().simplePath()

    ==>v[4]

    ==>v[6]

    ==>v[5]

    ==>v[3]

    3.例三 查询顶点1的所有相邻顶点(2,3,4),再次查询相邻的顶点(1,1,4,6,3,5,1),过滤重复路径的路径查看。

    gremlin> g.V(1).both().both().simplePath().path()

    ==>[v[1], v[3], v[4]]

    ==>[v[1], v[3], v[6]]

    ==>[v[1], v[4], v[5]]

    ==>[v[1], v[4], v[3]]

    四十一、Store Step

    四十二、Subgraph Step

    用于提取一部分子图用于分析。

    四十三、Sum Step

    sum()作用查询条件的总和

    1.