目录

  • 一:gremlin查询过程
  • 二:常用的查询方法

一:gremlin查询过程

gremlin的查询是流式查询,一步一步的进行下去,当然这里的“一步”可能是一个方法(g.V().has())也可能是多个方法组成的一步(g.V().order().by(desc,‘age’))。下面看一个案例

g.V().has('code','AUS').out().value('name','age').order().by('age',desc)

步骤解读
第一步:g.V() 标明是对图库中的所有节点进行操作的
第二步:has(‘code’,‘AUS’) 获取包含属性code并且该属性的值为AUS的所有节点
第三步:out() 获取上个结果集中所有节点的出边对应的节点
第四步:value(‘name’,‘age’) 获取上个结果集中所有节点的name和age属性值
第五步:order().by(‘age’,desc) 对结果集根据age进行降序排序
从上面便可以看出gremlin流式执行的特征,这使得gremlin的查询语句可以十分的灵活,从而满足我们的各种查询需求。

1:想要了解更多全面的查询方法,可以看英文官网:http://kelvinlawrence.net/book/Gremlin-Graph-Guide.html#_introduction
2:通过看本文章你会对gremlin查询的形式方法有大体的了解,之后找方法在官网就可以了
3:本文章在使用过程会不断更新


点击「文章最下方-Geek Tech」或搜索「Geek Tech」公众号可免费获取多种PDF技术文档:Java、图数据库、Git使用和原理、算法、如何单元测试等PDF! 还有每天的技术文章推送和每月免费送书抽奖!

  • 《一文教会你写90%的Shell脚本》PDF:发送消息“shell”
  • 《Git常用操作和Git底层原理全集》PDF:发送消息“git”
  • 《图解-图数据库系列合集》PDF:发送消息“图数据库”
  • 《近百页数据库和sql基础知识整理》PDF:发送消息“数据库”
  • HRM人事管理系统+经典飞机大战+像素鸟源码+:关注后发送消息“源码”
  • 更多免费pdf和资源可关注公众号查看!

二:常用的查询方法

  1. 首先,这里的g.V()中的g为遍历实例,其创建为:
graph = TinkerGraph.open()
g = graph.traversal()
  1. V()与E()

在下面的例子中,你会发现几乎每一个查询的开始都会有他们的存在
V()代表查看图中的所有节点,接下来的操作是对节点进行操作的
E()代表图中的所有边,接下来的操作就是对边操作的

  1. 使用value获取节点的某一属性值
g.V().has('code','AUS').out().value('name','age')
//获取AUS的出边对应节点的name和age属性的值
g.V().has('code','AUS').out().value()
//显示所有的属性值
  1. 使用has、hasNot获取(不)包含某一属性值得节点
g.V().has('code','AUS')
//获取拥有code属性并且其属性值为AUS的节点
g.V().has('user','code','AUS')
//相当于 g.V().hasLabel('user').has('code','AUS')
g.V().hasNot('name')
//获取所有不包含name属性的节点,等同于g.V().not(has('name'))
  1. 使用hasLabel获取label为某值得节点
g.V().hasLabel("user")
//获取label为user的节点
  1. 使用hasNext方法判断两个节点中是否有查询的边
  • 返回值为boolean类型参数,存在则返回true,不存在则false
g.V().has('code','AUS').out('route').has('code','DFW').hasNext()trueg.V().has('code','AUS').out('route').has('code','SYD').hasNext()false
  1. 使用range()获取某一范围内的数据
g.V().hasLabel('airport').range(0,2)
//输出结果集中1,2个节点
g.V().hasLabel('airport').range(3,6)
//输出结果集中4,5,6个节点
g.V().range(3500,-1)
//输出结果集中3500往后的所有节点
  1. 使用skip跳跃节点查找
g.V().has('region','US-TX').skip(5)
//跳过节点集中的前5条数据,从第六条开始,效果等同于下面的语句
g.V().has('region','US-TX').range(5,-1)
  1. 使用order对结果集进行排序
g.V().has('code','AUS').out().order().by()
g.V().has('code','AUS').out().order(local).
g.V().has('code','AUS').out()
g.V().has('code','AUS').out()

order(local)中local的作用:Notice also how local is used as a parameter to order. This is required so that the ordering is done while the final list is being constructed. If you do not specify local then order will have no effect as it will be applied to the entire result which is treated as a single entity at that point. 这是官网上的一句话,我翻译了一下没太明白,大体的意思我理解的是:加local参数的话会在最终结果生成前就完成排序。。大家可以翻译一下

  1. 使用out,in进行查找结点的出边和入边所对应的节点
g.V().has('code','AUS').out()
//获取AUS的节点所有出边对应的节点
g.V().has('code','AUS').out("brought")
//获取AUS节点所有边关系为“brought”的出边对应的节点
g.V().has('code','AUS').in()
//获取AUS的节点所有入边对应的节点
g.V().has('code','AUS').in("brought")
//获取AUS节点所有边关系为“brought”的入边对应的节点
  1. 使用count、groupCount对结果集计数
g.V().has('code','AUS').out().count()
//获取AUS节点的出边的个数
g.V().has('code','AUS').out().groupCount().by("name")
//根据结果集的name属性的值进行分组计数,最终结果类似于:[a:1,b:3,r:6]
  1. 使用dedup进行去重
g.V().has('code','AUS').out().out().dedup().count()
//步骤解读:
1:获取AUS节点的两度出节点,用dedup对结果进行去重
2:使用count()对结果集进行计数
  1. 使用aggregate创建一个临时集合
//获取AUS节点的大于两度出度的节点个数,注意应该不包含一度的节点
g.V().has('code','AUS').out().aggregate('nonstop').out().where(without('nonstop')).dedup().count()
//第一行获取一度的节点并将其结果集存储为一个临时集合命名为"nonstop"
//第二行获取二度节点,并且使用临时集合去除掉一度节点,去重,计数
  1. 使用limit、tail、timeLimit限制结果数量
g.V().hasLabel('airport').values('code').limit(20)
//只显示前20个
g.V().hasLabel('airport').values('code').tail(20)
//只显示最后20个
g.V().has('airport','code','AUS').repeat(timeLimit(10).out()).until(has('code','LHR')).path().by('code')
//上述作用:获取在10毫秒内查询到的结果
  1. 使用outE\inE outV\inV指定方向的边
  • 平常用法:
g.V().has('code','AUS').outE().inV().path()
g.V().has('code','AUS').inE().outV().path()
//获取出边或者入边
g.V().has('code','AUS').outE('brought').inV().path()
g.V().has('code','AUS').inE('brought').outV().path()
//获取指定的边关系的出边入边
  • 获取两个节点之间的边
g.V().has('code','MIA').outE().as('e').inV().has('code','DFW').select('e')
//第一步:选择源节点
//第二步:outE找到所有出边as('e')将结果存储为标签e
//第三步:inV().has('code','DFW')找到前面结果集的边入节点为code属性为DFW值得节点
//将边显示出来:结果类似于:
e[4127][16-route->8]
这样就获取到了两个节点之间的边
  1. 使用as,select和project来引用遍历步骤
  • as可以将前一个步骤结果集临时存储下来,便于下面使用
g.V().has('code','DFW').as('from').out().has('region','US-CA').as('to').select('from','to')
//has('code','DFW').as('from')   :将has('code','DFW')的结果集标识为from标签的临时结果,下面使用的时候直接使用from即可
//返回的结果类型
[from:v[8],to:v[13]]
[from:v[8],to:v[23]]
[from:v[8],to:v[24]]g.V().has('type','airport').limit(10).as('a','b','c').select('a','b','c').by('code').by('region').by(out().count())
//返回结果为:
[a:ATL,b:US-GA,c:232]
[a:ANC,b:US-AK,c:39]
[a:AUS,b:US-TX,c:59]
  • project()相当于select和by共同使用的效果
g.V().has('type','airport').limit(10).project('a','b','c').by('code').by('region').by(out().count())
//效果等同于:只不过上面的写法更加简洁
g.V().has('type','airport').limit(10).as('a','b','c').select('a','b','c').by('code').by('region').by(out().count())
//输出结果:
[a:ATL,b:US-GA,c:232]
[a:ANC,b:US-AK,c:39]
[a:AUS,b:US-TX,c:59]
  1. 相同标签的处理方式,在select中使用first,last,all参数
g.V(1).as('a').V(2).as('a').select(first,'a')
v[1]
//选择第一个a标签
g.V(1).as('a').V(2).as('a').select(last,'a')
v[2]
//选择最后一个a标签
g.V(1).as('a').V(2).as('a').select(all,'a')
[v[1],v[2]]
//选择所有a标签
g.V().has('code','AUS').as('a').out().as('a').limit(10).select(last,'a').by('code')g.V().has('code','AUS').as('a').out().as('a').limit(10).select(first,'a').by('code')g.V().has('code','AUS').as('a').out().as('a').limit(10).select(all,'a').unfold().values('code')
  1. 使用valueMap获取节点或者边的属性

返回结构:kv对数组,key:属性key,v:属性的值列表(list,这样可以显示该属性对应的多个值)

结构类似于:

[country:[US], code:[AUS], longest:[12248], city:[Austin], elev:[542], icao:[KAUS], lon:[-97.6698989868164], type:[airport], region:[US-TX], runways:[2], lat:[30.1944999694824], desc:[Austin Bergstrom International Airport]]

g.V().has('name','gremlin').valueMap()
//获得节点的所有属性
//valueMap在默认情况下不显示ID和label值,必须添加true参数
g.V().has('name','gremlin').valueMap(true)
//返回的集合中包含ID和label值
g.V().has('code','AUS').valueMap(true,'region')
//返回id+label+region三个属性的kv
g.E(5161).valueMap(true)
//返回id为5161边的属性

为了完整起见,还可以使用select来优化valueMap的结果

g.V().has('code','AUS').valueMap().select('code','icao','desc')
//返回的结果为 code+icao+desc属性的kv

如果想要结果集合更容易展现,可以使用unfold方法将其展开,但是结果的结构就变了,只是为了在 console上更加容易看

g.V().has('code','AUS').valueMap(true,'code','icao','desc','city').unfold()
//输出结果形式:
code=[AUS]
city=[Austin]
icao=[KAUS]
id=3
label=airport
desc=[Austin Bergstrom International Airport]
  1. 使用toList,toSet,bulkSet和fill创建集合
  • toList()创建结果集合为list集合,可重复,不排序,要想排序可以使用order方法
listr = g.V().has('airport','region','US-TX').values('runways').toList().join(',')
//此处的join(',')是将结果组合起来,用逗号分割,这样最终的结果就是一个字符串
//输出结果:
2,7,5,3,4,3,3,3,3,4,2,3,2,3,2,2,3,2,1,3,2,3,4,3,4,2//在我们项目中使用一般不会加join,因为最终结果只会是一个字符串
listr = g.V().has('airport','region','US-TX').values('runways').toList()
//使用集合的一些操作:
-> listr[1]
7-> listr.size()
26-> listr[1,3]
7
3
  • toSet()创建结果集合为Set集合,不可重复
setr = g.V().has('airport','region','US-TX').values('runways').toSet().join(',')
//输出结果:
1,2,3,4,5,7
  • toBulkSet()将结果集相同数据放在连续的位置,其余与tolist相同
setb= g.V().has('airport','region','US-TX').values('runways').toBulkSet().join(',')
//输出结果:
2,2,2,2,2,2,2,2,7,5,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,1//不使用join
setb= g.V().has('airport','region','US-TX').values('runways').toBulkSet()
//一些操作
setb.uniqueSize()
6setb.size()
26setb.asBulk()
2=8
7=1
5=1
3=11
4=4
1=1
  • fill方法将结果集填充入进一个自定义集合中
//案例一:
a = []
g.V().has('airport','region','US-TX').values('runways').fill(a)
//操作
a.size()
26a[1,3]
73
//案例二:
s = [] as Setg.V().has('airport','region','US-TX').values('runways').fill(s)
//操作
println s
[2, 7, 5, 3, 4, 1]

未完待续。。。。

「>>>>>>>点击下方公众号Tab栏关注我们,专注于程序员的技术公众号!<<<<<<<<<」

Gremlin-常用查询语句用法相关推荐

  1. MongoDB 查询语法与常用查询语句总结

    MongoDB 常用查询语句总结 先来一波查询语句语法的基本解释: 列子: db.mycol.find({"likes": {$gt:10}, $or: [{"by&qu ...

  2. Mongodb常用查询语句_笔记

    目录 前言 一.Mongodb简介 二.Mongodb常用查询语句 总结 前言 工作中会使用到Mongodb数据库,这是一个非关系型数据库,所以它的一些查询语句跟sql会不太一样,一时半会不能马上写出 ...

  3. SQL常用查询语句汇总

    SQL查询关键字为SELECT,常用查询语句代码及结果如下(本文使用MySQL数据库管理系统): -- 1检索单个列 SELECT prod_name FROM Products;-- 2检索多个列 ...

  4. 结构化查询语句简称mysql_整理MySql常用查询语句

    MySql的性能优化 性能优化是通过某些有效的方法提高MySQL数据库的性能.性能优化的目的是为了是MySQL数据运行速度更快.占用的磁盘空间更小.性能优化包括很多方面,例如优化查询速度.优化更新速度 ...

  5. mysql 常用查询语句

    常用的查询语句 数据库使用的是:mysql 8.0.28,安装过程可参考: mysql 8.0安装教程 1.初识SQL SQL是为操作数据库而开发的语言.国际标准化组织(ISO)为 SQL 制定了相应 ...

  6. MySQL数据库的查询:常用查询语句、MySQL函数、多表查询、视图表

    文章目录 一.构造数据 二.常用的查询语句 1.SELECT:字段表达式 2.FROM 子句 3.WHERE 子句:按指定条件过滤 4.GROUP BY:分组查询 5.HAVING 6.ORDER B ...

  7. 数据库MySQL(一) 常用查询语句

    MySQL笔记 数据库表.查询.排序.数据处理函数 1 数据库 什么是数据库?什么是数据库管理系统?什么是SQL?它们之间的关系? 数据库: 顾名思义:存储数据的仓库,实际上就是一堆文件,这些文件中存 ...

  8. Hive 表常用查询语句-总结

    Hive之前不常用,每次都是现用现查,就是现在总结记下笔记,边学边记(下面都是一些简单的例子,由易到难吗)>_<. 1.基本的查询语句 现在假设有数据库 db,数据表table1,tabl ...

  9. DB2数据库常用查询语句

    DB2数据库常用查询: 1.DB2查找存储过程语句,存储过程名字大写 SELECT PROCNAME,TEXT,CREATE_TIME,A. * FROM SYSCAT.PROCEDURES a WH ...

最新文章

  1. 计算机基础知识与基本操作txt,计算机基础知识复习-20210707023705.pdf-原创力文档...
  2. 给gridview动态生成radiobutton添加OnCheckedChanged事件
  3. php+如何按文字分割文件夹,PHP实现的大文件切割与合并功能示例
  4. 【渝粤教育】 国家开放大学2020年春季 1366英语教学理论与实践 参考试题
  5. return ,continue,break的用法与区别总结
  6. 华为云原生数据仓库GaussDB(DWS)深度技术解读:融、快、大、稳、易
  7. 实战oracle 12c 处理索引坏块一例
  8. nemesis什么车_马力2100匹《Trion Nemesis》谜样超跑诞生中?
  9. 从skyeye学习arm( 工具篇)
  10. php 怎么更新浏览器缓存文件在哪里,PHP 设置动态网页在浏览器的缓存
  11. ubb码转换的java类库 ubb2html_ubb代码转换为html
  12. Win10常用命令:定时关机(shutdown命令)
  13. java一元二次方程用if_用javascript写一个求一元二次方程的页面 用JAVA写一个求解一元二次方程的类...
  14. Java解P2678 [NOIP2015 提高组] 跳石头,有图有注释,通俗易懂
  15. 《学会提问-批判性思维指南》--70页原创PPT免费分享 (评论: 学会提问)
  16. 计算机提示无法验证发布者,win7系统取消“无法验证发布者”提示框的操作技巧...
  17. Druid实现数据库连接用户密码加密
  18. 淘宝天猫数据分析工具推荐(竞品数据监控查询)
  19. 《有限与无限的游戏》第三章 我是自己的天才:经典摘抄(2)
  20. 快速启动栏增强工具 Free Launch Bar

热门文章

  1. 如何打造高效的团队(一) - 团队架构
  2. 35岁以上高龄程序员,即将被裁员,该何去何从?
  3. 前端优化-改善滑动流畅度的几类方法
  4. 像“今日头条”这样的模块滑动特效,大概咋写,求指点 ?---酷课堂iOS交流群问答整理(201805期)
  5. Oracle 12C In-Memory特性研究
  6. 冒泡排序从左到右 从右到左方法实现(三种方法)
  7. Linkis简单版安装教程
  8. 免费的聚合数据新闻头条API接口调用
  9. 蓝光影视媒体菜单结构浅析[原版加字幕保留花絮/主菜单/弹出菜单并分割对应PS3]...
  10. Science: 重新“野化“ 植物微生物组