Gremlin -- 常用查询用法 - 腾讯云开发者社区-腾讯云


本站和网页 https://cloud.tencent.com/developer/article/1383489 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Gremlin -- 常用查询用法 - 腾讯云开发者社区-腾讯云腾讯云备案控制台开发者社区学习实践活动专区工具TVP文章/答案/技术大牛搜索搜索关闭写文章提问登录/注册洋仔聊编程122 篇文章Gremlin -- 常用查询用法转到我的清单专栏首页Java开发必知必会Gremlin -- 常用查询用法96分享分享文章到朋友圈分享文章到 QQ分享文章到微博复制文章链接到剪贴板海报分享海报分享Gremlin -- 常用查询用法发布于2019-01-15 16:51:50阅读 9.4K0目录一:gremlin查询过程二:常用的查询方法三:java中如何使用呢?1:创建源节点2:组装语句一: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:本文章在使用过程会不断更新
二:常用的查询方法首先,这里的g.V()中的g为遍历实例,其创建为:graph = TinkerGraph.open()
g = graph.traversal() 复制V()与E() 在下面的例子中,你会发现几乎每一个查询的开始都会有他们的存在
V()代表查看图中的所有节点,接下来的操作是对节点进行操作的
E()代表图中的所有边,接下来的操作就是对边操作的
使用value获取节点的某一属性值g.V().has('code','AUS').out().value('name','age')
//获取AUS的出边对应节点的name和age属性的值
g.V().has('code','AUS').out().value()
//显示所有的属性值复制使用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'))复制使用hasLabel获取label为某值得节点g.V().hasLabel("user")
//获取label为user的节点复制使用hasNext方法判断两个节点中是否有查询的边返回值为boolean类型参数,存在则返回true,不存在则falseg.V().has('code','AUS').out('route').has('code','DFW').hasNext()
true
g.V().has('code','AUS').out('route').has('code','SYD').hasNext()
false复制使用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往后的所有节点复制使用skip跳跃节点查找g.V().has('region','US-TX').skip(5)
//跳过节点集中的前5条数据,从第六条开始,效果等同于下面的语句
g.V().has('region','US-TX').range(5,-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参数的话会在最终结果生成前就完成排序。。大家可以翻译一下
使用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”的入边对应的节点复制使用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]复制使用dedup进行去重g.V().has('code','AUS').out().out().dedup().count()
//步骤解读:
1:获取AUS节点的两度出节点,用dedup对结果进行去重
2:使用count()对结果集进行计数复制使用aggregate创建一个临时集合//获取AUS节点的大于两度出度的节点个数,注意应该不包含一度的节点
g.V().has('code','AUS').out().aggregate('nonstop').
out().where(without('nonstop')).dedup().count()
//第一行获取一度的节点并将其结果集存储为一个临时集合命名为"nonstop"
//第二行获取二度节点,并且使用临时集合去除掉一度节点,去重,计数复制使用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毫秒内查询到的结果复制使用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]
这样就获取到了两个节点之间的边复制使用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]复制相同标签的处理方式,在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')复制使用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]复制使用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]
-> listr.size()
26
-> listr[1,3]
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()
setb.size()
26
setb.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()
26
a[1,3]
73
//案例二:
s = [] as Setg.V().has('airport','region','US-TX').values('runways').fill(s)
//操作
println s
[2, 7, 5, 3, 4, 1]复制 未完待续。。。。
三:java中如何使用呢?1:创建源节点private GraphTraversal createGraphTraversalByIdLabel(String id,String label,Map<String,Object> propertys){
GraphTraversal graphTraversal = null;
if(StringUtils.isNotEmpty(id)){
graphTraversal = getGraphTraversalSource().V(id);
}else{
graphTraversal = getGraphTraversalSource().V();
if(StringUtils.isNotEmpty(label)){
graphTraversal = graphTraversal.hasLabel(label);
if(propertys!=null&&propertys.size()>0){
for (Object o : propertys.entrySet()) {
Map.Entry entry = (Map.Entry) o;
String key = entry.getKey().toString().trim();
String value = entry.getValue().toString().trim();
if(StringUtils.isNotEmpty(key) &&
StringUtils.isNotEmpty(value))
graphTraversal = graphTraversal.has(key, value);
return graphTraversal;
}复制2:组装语句@Override
public GraphTraversal timeLineGraphPath(String id, String label,
Map<String, Object> propertys,
String[] edgeLabels, String type,
String beginTime, String endTime) {
GraphTraversal graphTraversal = createGraphTraversalByIdLabel(id,label,propertys);
if(edgeLabels==null||edgeLabels.length==0)
return graphTraversal.valueMap(true);
else
return graphTraversal.outE(edgeLabels).and(__.has(type,P.gte(beginTime)),__.has(type,P.lte(endTime))).outV().path().order().by(type);
}复制 其中的”_.“是填充字符,只是为了可以使用方法,比如and( _.has(type,P.gte(beginTime)。。中如果没有__.的话,不能这写吧,也不支持呀and(.has()。。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!本文分享自作者个人站点/博客:https://blog.csdn.net/csdn___lyy复制如有侵权,请联系 cloudcommunity@tencent.com 删除。展开阅读全文数据处理举报点赞 9分享登录 后参与评论0 条评论相关文章Gremlin-常用查询语句用法gremlin的查询是流式查询,一步一步的进行下去,当然这里的“一步”可能是一个方法(g.V().has())也可能是多个方法组成的一步(g.V().order...洋仔聊编程Gremlin 图查询概述图形数据库是 NoSQL 数据库的一种类型,它应用图形理论存储实体之间的关系信息。最常见的例子,就是社会网络中人与人之间的关系。关系型数据库用于存储关系型数据的...Spark学习技巧6. Gremlin查询语言Gremlin是JanusGraph的查询语言,用于从图中检索数据和更新数据。 Gremlin是一种面向路径的语言,它能够简洁地表示复杂的图形遍历和多步操作。 ...公号:咻咻ing图数据库查询语言Cypher、Gremlin和SPARQL这里有个关键词”semantic queries”,与之相对应的可能是形式语言(Formal Language)中只关心句法。最让人心碎的是:陈黎栋mysql 查询用法#去重复查询DISTINCT
mysql> select * from student;
+------+------+------+
| uid | nam...零月Elasticsearch常用查询本文使用的Elasticsearch版本为6.5.4,上文主要介绍ES的各种查询,以满足更多的需求。ES的主要功能其实就是体现在这搜索查询上,所以我就总结一下,...用户3467126一文了解各大图数据库查询语言(Gremlin vs Cypher vs nGQL)| 操作入门篇文章的开头我们先来看下什么是图数据库,根据维基百科的定义:图数据库是使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。NebulaGraphSimpleDateFormat 常用用法[通俗易懂] 1、SimpleDateFormat函数语法:
G 年代标志符
y 年
M 月
...全栈程序员站长ElasticSearch常用查询命令
http://IP:9200/indexName/_search?pretty=true双面人<导图>Mysql常用查询语法普通查询
查看整个表
格式:
select * from 表名;
示例:
select * from students;
查询指定字段
格式
...zhaooleeElasticsearch 常用基本查询安装启动很简单,参考官网步骤:https://www.elastic.co/downloads/elasticsearch用户7353950Oracle常用SQL查询业务场景:在报表开发中,只需要每个分组最近的一条数据。例如:某天的明细数据中,可能存在多条记录,只需要该天最后更新的一条记录。程裕强MongoDB 常用查询操作在进行操作讲解前,先展示当前 MongoDB 中已存在的文档,集合名称articleytaoMysql常用查询语句一查询数值型数据:
SELECT * FROM tb_name WHERE sum > 100;
查询谓词:>,=,<,<>,!=,!>,!<,=>,=<Java架构师历程【翻译】Gremlin-Gremlin何许人也?Gremlin是Apache TinkerPop 框架下的图遍历语言,而TinkerPop是JanusGraph的搜索引擎。Gremlin是一种函数式数据流语言...洋仔聊编程mybatis :Criteria 查询、条件过滤用法PS:hibernate 中也有 Criteria 的用法,见另一文章:jpa : criteria 作排除过滤、查询微风-- 轻许--PyQuery常用用法总结PyQuery是一个类似于jQuery的解析网页工具,使用lxml操作xml和html文档,它的语法和jQuery很像。和XPATH,Beautiful Sou...全栈程序员站长气象常用库 | cartopy常用用法总结10.在上一题基础上,添加国境线,并指定线宽为0.1(不推荐使用,因为该默认参数会使得我国部分领土丢失)自学气象人更多文章作者介绍洋仔聊编程58集团研发工程师关注专栏文章122阅读量148.9K获赞331作者排名405精选专题腾讯云原生专题云原生技术干货,业务实践落地。活动推荐腾讯云自媒体分享计划入驻社区,可分享总价值百万资源包立即入驻邀请好友加入自媒体分享计划邀请好友,同享奖励 30 / 100 / 180 元云服务器代金券立即邀请运营活动广告关闭目录一:gremlin查询过程二:常用的查询方法三:java中如何使用呢?1:创建源节点2:组装语句社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于视频介绍社区规范免责声明联系我们友情链接归档问题归档专栏文章归档快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列 网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN 加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2022 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 京公网安备 11010802017518 粤B2-20090059-1扫描二维码扫码关注腾讯云开发者领取腾讯云代金券