ArangoDB 的graph查询
一个graph包含vertices 和edges。edges被存储在edges document当中。vertices可以是document collection 中的document也可以是edge document中的document。所以说edges也可以被当做vertices来使用。
1、数据准备
使用arangoimp导入飞机场和航班csv数据信息。
导入飞机场信息
arangoimp --file <em>path to airports.csv</em> on your machine --collection
airports --create-collection true --type csv
这里我们创建了一个document collection;为每一行创建一个document.标题被作为属性名称。其中标题中包含一个_key的值,系统将自动识别该列作为_key.
现在打开浏览器(http://localhost:8529)便可以看到刚刚导入的信息了。
可以点击浏览器中的queries进行查询:
查询所有的机场
FOR airport in ariports
RETURN airport
仅查询加利福尼亚机场信息
FOR airport IN airports
FILTER airport.state==‘CA’
RETURN airport
查询每个州拥有的机场数量
FOR airport IN airports
COLLECT state = airport.state
WITH COUNT ON counter
RETURN {state,counter}
导入航班信息
arangoimp --file <em>path to flights.csv</em> on your machine --collection
flights --create-collection true --type csv --create-collection-type
edge
这里创建的是edge collection,为每一行创建一个edge,同时自动创建一个edge index方便快速查询(_from和_to组成了这样的index.).在csv中有两个特殊的列_from 和_to,它们的值为airports collection中的id,指明了从一个机场飞往另外一个机场。
2、graph数据查询
语法
FOR Vertex,Edge,Path IN [min..max ] [OUTBAND|INBOUND|ANY] startvertex EDGECOLLECTION
分析:
FOR 遍历三个变量,分别是点(vertex)、关联(edge),点和关系组成的路线(path)
IN 在哪个EDGE COLLECTION中
[min..max]遍历的最小深度、最大深度或者遍历的深度范围
OUTBOUND:从startvertex原始断点开始向外查询,即from 为startvertex;INBOUND为向内查询,即to为startvertex,any:两个方向全部查询
startvertex:开始查询的断点
EDGE COLLECTION 遍历的collection,可以是一个或多个edge collection
查询示例:
查所洛杉矶可以直达的所有飞机场
FOR airport IN
OUTBOUND 'airports/LAX'
flights
RETURN DISTICT airport
返回10个从洛杉矶可以到达的飞机场及其航班。
FOR ariport flight IN
OUTBOUND 'airports/LAX'
LIMIT 10
flights
RETURN {airpot,flight}
3、查询选项
(1)遍历深度优先还是广度优先
所有遍历查询默认是深度优先,深度优先和广度优先都会返回相同的结果。但计算性能有时会相差很大。
如果要得到所有的节点,那么深度优先和广度优先效率一样。因为都要跑完所有的节点。
如果要是有筛选filter或者限制(limit)导致不完全筛选,那广度优先可能会有更高的效率。
广度优先示例:
FOR v IN 1..10 OUTBOUND 'vertical/s' edgs<br>OPTIONS {bfs:true}
FILTER v._key=='F'
LIMIT 1
RETURN v
(2)唯一遍历
由于不同点之间的路径可能有多条,也可能存在闭环线路
默认情况下,遍历的时候如果path中遇到了相同的edge就会停止遍历;这将可以防止遍历存在绕圈情况,让遍历可以到达最底层节点。
在一个path上可能会出现重复的vertex,除非你明确声明不要重复的点。
示例
FOR v,e,p IN 1..5 OUTBOUND 'vertex/s' edgs
OPTIONS {
uniqueVertices:'none',
uniqueEdges:'path'
}
RETURN CONCAT_SEPARATOR('->',p.vertices[*]._key)
这个uniqueVertices:‘none’和uniqueEdges:‘path’都是默认设置,不设置也是一样。这样最开是的节点也可以是最后的节点,因为我们在设置的时候并没有要求path中有唯一的点。如果要设置为唯一的,可以也设置为‘path’,这样一条路径中的点也将变为唯一的。
global保证每个点在所有遍历中只出现一次。它仅适用于广度优先。示例
FOR v IN 1..5 OUTBOUND 'vertex/s' edgs
OPTIONS{
bfs:ture,
uniqueVertices:'global'
RETURN v._key
从洛杉矶可以直达的机场
FOR ariport IN OUTBOUND 'airports/LAX' flights
OPTIONS {
bfs:true,
uniqueVertices:'global'}
RETURN airport
这个查询将比上面的使用distict快很多。因为distict是在遍历完所有节点后再去除重复的,而options则可以直接过掉重复的结果不进行遍历。
4、LET关键字
LET可以用来声明变量,来将查询结果赋值给变量。
FOR f IN flights
FILTER f._from == 'airports/BIS'
LIMIT 100
LET h = FLOOR(f.DepTime / 100)
LET m = f.DepTime % 100
RETURN {
year: f.Year,
month: f.Month,
day: f.DayofMonth,
time: f.DepTime,
iso: DATE_ISO8601(f.Year, f.Month, f.DayofMonth, h, m)
}
5、shortest_path最短路径
找到BIS 和JFK之间的最短路径
FOR v IN OUTBOUND
SHORTEST_PATH 'airports/BIS'
TO 'airports/JFK' flights
RETURN v
注意,最短路径只是找到一条路径进行返回,其实可能还有其他的可能性。
LET airports = (
FOR v IN OUTBOUND
SHORTEST_PATH 'airports/BIS'
TO 'airports/JFK' flights
RETURN v
)
RETURN LENGTH(airports) - 1
找到最少需要经过的机场,-1代表不包括最后一个节点。
在SHORTEST_PATH中不能使用filter只能使用pattern matching代替。
6、pattern matching
问题:找到BIS 和 JFK之间最短的旅行时间。
第一步:找到BIS和JFK之间的最短路径,我们已经知道最短路径为2.
FOR v,e,p IN 2 OUTBOUND 'airports/BIS' flights
FILTER v.id='airports/JFK'
LIMIT 5
RETURN p
第二步:我们确定在同一天内,假设都为1月1日。
FOR v,e,p IN 2 OUTBOUND 'airports/BIS' flights
FILTER v._id='airports/JFK'
FILTER p.edges[*].month all == 1
FILTER p.edges[*].DayOfMonth all == 1
LIMIT 5
RETURN p
数组之间的比较可以使用all,any ,none来表示。
第三步:计算每条path的飞行时间,并按照升序排列,这里使用DATE.DIFF()来计算
FOR v,e,p IN 2 OUTBOUND 'airports/BIS' flights
FILTER v._id='airports/JFK'
FILTER p.edges[*].month.all == 1
FILTER p.edges[*].DayofMonth all == 1
LET flightTime = DATE_DIFF(p.edges[0].DepTimeUTC-p.edges[1].ArrTimeUTC,'i')
SORT filghtTIme ASC
LIMIT 5
RETURN {flight:p,time:flightTime}
第四步:确定让中转时候的到达时间小于离开时间20分钟
FOR v, e, p IN 2 OUTBOUND 'airports/BIS' flights
FILTER v._id == 'airports/JFK'
FILTER p.edges[*].Month ALL == 1
FILTER p.edges[*].DayofMonth ALL == 1
FILTER DATE_ADD(p.edges[].ArrTimeUTC, 20, 'minutes') < p.edges[].DepTimeUTC
LET flightTime = DATE_DIFF(p.edges[].DepTimeUTC, p.edges[].ArrTimeUTC, 'i')
SORT flightTime ASC
LIMIT 5
RETURN { flight: p, time: flightTime }
使用index进行优化
建立一个点中心索引,以_from,Month,DayOfMonth三个为联合索引字段。即将FILTER的三个字段作为索引字段。
如果不以三个为联合索引,那么系统将自动从首先筛选_from,其次遍历month,其次遍历_day,有了联合索引直接就会找到‘airports/jfk’,month=1,dayofmonth=1,只用一次遍历即可完成。因此联合索引大大提高了遍历的效率。
本文章转载于博客园-ArangoDB 学习笔记 (4)graph
ArangoDB 的graph查询的更多相关文章
- ArangoDB图数据库--总参
参考文章: ArangoDB原生多模型数据库(百科) ArangoDB官网 ArangoDB数据库入门 arangodb-vs-cassandra arangodb-vs-mongodb2 Arang ...
- 在PowerShell脚本中集成Microsoft Graph
作者:陈希章 发表于2017年4月23日 我旗帜鲜明地表态,我很喜欢PowerShell,相比较于此前的Cmd Shell,它有一些重大的创新,例如基于.NET的类型系统,以及管道.模块的概念等等.那 ...
- 掀起Azure AD的盖头来——深入理解Microsoft Graph应用程序和服务权限声明
作者:陈希章 发表于 2017年7月12日 引子 这是一篇计划外的文章.我们都知道要进行Microsoft Graph的开发的话,需要进行应用程序注册.这个在此前我已经有专门的文章写过了.但这里存在一 ...
- Nebula Graph 在微众银行数据治理业务的实践
本文为微众银行大数据平台:周可在 nMeetup 深圳场的演讲这里文字稿,演讲视频参见:B站 自我介绍下,我是微众银行大数据平台的工程师:周可,今天给大家分享一下 Nebula Graph 在微众银行 ...
- py2neo的使用(转)
转自:https://blog.csdn.net/sinat_26917383/article/details/79901207#24-%E7%B1%BB%E4%BC%BCset%E7%9A%84%E ...
- grandstack graphql 工具基本试用
grandstack 是一个方便graphql 应用开发的工具 使用docker-compose 运行 环境准备 官方的starter 比较好,已经是使用docker-compose 创建好了所有 ...
- janusgraph-控制台操作命令
当顶点数量过多时(我的230w)删除太慢 就用下面的命令, 删除整个图库 graph.close() JanusGraphFactory.drop(graph) 查询所有的顶点属性 用traversa ...
- prometheus+grafana监控Linux和kubernetes的例子
1.安装和配置prometheus tar zxvf prometheus-.linux-amd64.tar.gz -C /usr/local/ ln -sv /usr/local/prometheu ...
- virtuoso操作graph的方法--查询和删除
在virtuoso中查看某个graph的数据,直接用sparql语句查询就可以了,对graph进行查询也可以通过sparql实现,删除graph则要在isql中操作. 1 查询graph的命令 在lo ...
随机推荐
- Thymeleaf 遇到的问题
1. 后台传递long类型的值作为 js 执行方法的参数,精准度失效解决办法 解决办法:用thymeleaf的拼接字符串方法来解决 例:<button class="btn btn-p ...
- python文件的读写总结
读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...
- 【学习总结】Python-3-多个变量赋值
菜鸟教程-Python3-基本数据类型 同时为多个变量赋值的两种格式: 连等:看起来可能错误但事实上Python可以这样的.... 一团变量对应一团值:比较常见又省事的格式 END
- Ecplise无法启动“failed to create the JAVA Virtual Machine”
打开Ecplise时报错:“failed to create the JAVA Virtual Machine”,java配制也没有问题,然后尝试运行eclipsec.exe,报错了另一个信息:“Co ...
- C#编程—第四天
五一放假三天 ······续写第三天的if else-if.if语句的嵌套.很多例题(还有很多没有整理好的) 5.4下午初步学习循环语句for 老师布置了几个小练习题 循环语句 循环:可以反复执行某段 ...
- 2019牛客多校第一场E ABBA 贪心 + DP
题意:问有多少个有(n + m)个A和(n + m)个B的字符串可以凑出n个AB和m个BA. 思路:首先贪心的发现,如果从前往后扫,遇到了一个A,优先把它看成AB的A,B同理.这个贪心策略用邻项交换很 ...
- HDU-4609(FFT/NTT)
HDU-4609(FFT/NTT) 题意: 给出n个木棒,现从中不重复地选出3根来,求能拼出三角形的概率. 计算合法概率容易出现重复,所以建议计算不合法方案数 枚举选出的最大边是哪条,然后考虑剩下两条 ...
- Ubuntu下的安装notepad++
Ubuntu下的安装方法: sudo add-apt-repository ppa:notepadqq-team/notepadqq sudo apt-get update sudo apt-get ...
- 这样才能正确解锁MaxCompute客户端
大数据计算服务(MaxCompute,原名ODPS)是一种快速.完全托管的TB/PB级数据仓库解决方案.MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决 ...
- bzoj 3251
http://www.lydsy.com/JudgeOnline/problem.php?id=3251 这道题在北京八十中的时候有人讲过.. 不过由于自己continue 写掉了一个所以调了很久. ...