ArangoDB简单实例介绍
数据介绍:
2008美国国内航班数据
- airports.csv
- flights.csv
数据下载地址:https://www.arangodb.com/graphcourse_demodata_arangodb-1/
数据导入:
在终端中输入以下命令:
arangoimp --file path to airports.csv on your machine --collection airports --create-collection true --type csv
显示以下结果:
使用网页UI:
COLLECTIONS
点击页面左侧按钮"COLLECTIONS",可以看到之前导入的数据集"airports",图标样式表明它是一个文本集合
点击进入数据集"airports",该页面包含了对数据集的预览、筛选、上传、下载和删除等操作
QUERIES
该模块提供了AQL查询功能
尝试几个简单的查询
1、返回数据集"airports"中所有的airports:
FOR airport IN airports
RETURN airport
2、只返回California的airports:
FOR airport IN airports
FILTER airport.state == "CA"
RETURN airport
3、返回每个国家的机场数量
FOR airport IN airports
COLLECT state = airport.state
WITH COUNT INTO counter
RETURN {state, counter}
注意:
在上面的代码示例中,所有关键字COLLECT、WITH和RETURN等都是大写的,但它只是一个约定。你也可以将所有关键词小写或混合大小写。但是变量名、属性名和集合名是区分大小写的。
Graph Basics:
上面的例子中,我们使用的数据"airports"可以当做图的节点,但是为了完善图,我们还需要数据来作为边,在这里我们使用''flights"中的数据作为边。
首先导入"flights.csv"文件
arangoimp --file "/home/data/flights.csv" --collection flights --create-collection true --type csv --create-collection-type edge
得到如下结果表明数据导入成功:
the concepts of the query options:
FOR vertex[, edge[, path]]
IN [min[..max]]
OUTBOUND|INBOUND|ANY startVertex
edgeCollection[, more…]
Explanation
FOR 有三个参数
‣ vertex (object): 遍历中的当前顶点
‣ edge (object, optional): 遍历中的当前边
‣ path (object, optional): 两个对象的路径表示
‣ vertices: 此路径上所有顶点的数组
‣ edges: 此路径上所有边的数组
IN min..max: 定义遍历的最小深度和最大深度。如果未指定,默认为1!
OUTBOUND/INBOUND/ANY :定义搜索的方向
edgeCollection: 保存在遍历中要考虑的边缘的集合的一个或多个名称
OPTIONS
options(object,optional):用于修改遍历的执行。只有以下属性有效果,所有其他属性将被忽略:
uniqueVertices(string):可选地确保顶点唯一性
“path” - 保证没有路径返回一个重复的顶点
“global” - 保证在遍历期间每个顶点最多被访问一次,无论从起始顶点到这个顶点有多少路径。如果您从最小深度min depth > 1
之前发现的顶点开始,可能根本不会返回(它仍然可能是路径的一部分)。注意: 使用此配置,结果不再是确定性的。如果从startVertex到顶点有多条路径,则选择其中一条路径。
“none”(默认) - 不对顶点应用唯一性检查
uniqueEdges(string):可选地确保边缘唯一性
“path”(默认) - 保证没有路径返回一个重复的边
“global” - 保证在遍历过程中,每个边缘最多被访问一次,无论从起始顶点到该边缘有多少条路径。如果从a开始,min depth > 1
在最小深度之前发现的边缘根本不会被返回(它仍然可能是路径的一部分)。注意: 使用此配置,结果不再是确定性的。如果有从多个路径startVertex超过边缘的那些中的一个被拾取。
“none” - 不对边缘应用唯一性检查。注意: 使用此配置,遍历将跟随边沿周期。
bfs(bool):可选地使用可选的宽度优先遍历算法
true - 遍历将被执行宽度优先。结果将首先包含深度1的所有顶点。比深度2处的所有顶点等等。
false(默认) - 遍历将以深度优先执行。它首先将深度1的一个顶点的最小深度的最小深度返回到最大深度。对于深度1处的下一个顶点,依此类推。
图查询:
1、返回能到达洛杉矶国际机场(Lax)的所有机场
FOR airport IN OUTBOUND 'airports/LAX' flights
RETURN DISTINCT airport
2、返回10个洛杉矶的航班和他们的目的地
FOR airport, flight IN OUTBOUND 'airports/LAX' flights
LIMIT
RETURN {airport, flight}
遍历图:
对于最小深度大于2的遍历,有两个选项可以选择:
深度优先(默认):继续沿着从起始顶点到该路径上的最后顶点的边缘,或者直到达到最大遍历深度,然后向下走其他路径
广度优先(可选):从开始顶点到下一个级别遵循所有边缘,然后按另一个级别跟踪邻居的所有边缘,并继续这个模式,直到没有更多的边缘跟随或达到最大的遍历深度。
返回LAX直达的所有机场:
FOR airport IN OUTBOUND 'airports/LAX' flights
OPTIONS {bfs: true, uniqueVertices: 'global'}
RETURN airport
通过执行时间与之前的查询进行比较,返回相同的机场:
FOR airport IN OUTBOUND 'airports/LAX' flights
RETURN DISTINCT airport
对比这两次结果,将看到显著的性能改进。
The LET keyword in AQL
Hands on: Storing Results in Variables
简单表达式以及整个子查询的结果可以存储在变量中。若要声明变量,请使用LET关键字,后面跟着变量名、等号和表达式。如果表达式是子查询,则代码必须位于括号中。
在下面的示例中,预先计算出发时间的时间和分钟,并将其存储在变量H和M中。
FOR f IN flights
FILTER f._from == 'airports/BIS'
LIMIT
LET h = FLOOR(f.DepTime / )
LET m = f.DepTime %
RETURN {
year: f.Year,
month: f.Month,
day: f.DayofMonth,
time: f.DepTime,
iso: DATE_ISO8601(f.Year, f.Month, f.DayofMonth, h, m)
}
Shortest_Path
最短路径查询在两个给定文档之间找到连接,其边缘数量最少。
寻找机场BIS和JFK之间的最短路径:
FOR v IN OUTBOUND
SHORTEST_PATH 'airports/BIS'
TO 'airports/JFK' flights
RETURN v
返回从BIS到JFK的最小航班数:
LET airports = (
FOR v IN OUTBOUND
SHORTEST_PATH 'airports/BIS'
TO 'airports/JFK' flights
RETURN v
)
RETURN LENGTH(airports) -
Pattern Matching
目标:找出BIS与JFK之间花费时间最短的路径
STEP1
筛选BIS到JFK的所有路径,由于在shortest path中最短路径深度为2,所以这里直接使用“IN 2 OUTBOUND”
FOR v, e, p IN OUTBOUND 'airports/BIS' flights
FILTER v._id == 'airports/JFK'
LIMIT
RETURN p
STEP2
筛选一天内的路径,这里以1月1号为例
FOR v, e, p IN OUTBOUND 'airports/BIS' flights
FILTER v._id == 'airports/JFK'
FILTER p.edges[*].Month ALL ==
FILTER p.edges[*].DayofMonth ALL ==
LIMIT
RETURN p
STEP3
使用DATE_DIFF() 函数计算出发时间与到达时间的差值,然后将结果升序排列
FOR v, e, p IN OUTBOUND 'airports/BIS' flights
FILTER v._id == 'airports/JFK'
FILTER p.edges[*].Month ALL ==
FILTER p.edges[*].DayofMonth ALL ==
LET flightTime = DATE_DIFF(p.edges[].DepTimeUTC, p.edges[].ArrTimeUTC, 'i')
SORT flightTime ASC
LIMIT
RETURN { flight: p, time: flightTime }
通过观察结果,我们发现有些结果是负值。原因是有些路径中,第一条航线未降落时,第二条就已经起飞,为此需要增加一条限定条件。
FOR v, e, p IN OUTBOUND 'airports/BIS' flights
FILTER v._id == 'airports/JFK'
FILTER p.edges[*].Month ALL ==
FILTER p.edges[*].DayofMonth ALL ==
FILTER DATE_ADD(p.edges[].ArrTimeUTC, , 'minutes') < p.edges[].DepTimeUTC
LET flightTime = DATE_DIFF(p.edges[].DepTimeUTC, p.edges[].ArrTimeUTC, 'i')
SORT flightTime ASC
LIMIT
RETURN { flight: p, time: flightTime }
至此,已经得到了用时最短的路径。
优化:
在这个例子中,我们的查询需要遍历非常多的边,其中有些边是不需要去遍历的。我们这里用vertex-centric index方法来优化。
‣ 进入Collection界面
‣ 打开 flights collection
‣ 点击Indexes 选项
‣ 点击绿色的+号来添加一个新的索引
‣ 设置 Type 为 Hash Index
‣ 在Fields中填写 _from,Month,DayofMonth
‣ 点击绿色Create 选项生成新索引
重新运行STEP3代码,会发现运行效率大大提高,点击Explain选项能够看到以下信息:
原理解释:
如果没有以顶点为中心的索引,则需要跟踪出发机场的所有外出边缘,然后检查它们是否满足我们的条件(在某一天,到达期望的目的地,具有可行的中转)。
我们创建的新索引允许在某一天(Month,DayofMonth属性)内快速查找离开机场的外部边缘(_from属性),这消除了在不同天提取和过滤所有边缘的需要。它减少了需要用原始索引检查边缘的数量,并节省了相当长的时间。
参考资料:
https://www.arangodb.com/documentation/
欢迎转载,转载请注明网址:https://www.cnblogs.com/minglex/p/9383849.html
ArangoDB简单实例介绍的更多相关文章
- Spring Security4.X 简单实例介绍
简介 本例子采用的是SpringMVC.SpringSecurity和Spring整合的简单使用 使用gradle搭建的项目(gradle比maven更加便捷),可以自行了解 web.xml配置 &l ...
- 最新 Eclipse IDE下的Spring框架配置及简单实例
前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...
- .NET多线程总结和实例介绍
摘要:.Net提供了许多多线程编程工具,可能是因为太多了,所以掌握起来总是有一些头疼,我在这里讲讲我总结的一些多线程编程的经验,希望对大家有帮助. 1.多线程的总结 不需要传递参数,也不需要返回参数 ...
- 【转】Android Https服务器端和客户端简单实例
转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...
- 【转】Web Service单元测试工具实例介绍之SoapUI
转自:http://blog.csdn.net/oracle_microsoft/article/details/5689585 SoapUI 是当前比较简单实用的开源Web Service 测试工具 ...
- Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
目录 [TOC] 1.环境准备 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...
- vue路由的简单实例
vue2.0 和 vue1.0 路由的语法还是有点稍微的差别,下面介绍一下vue-router 2的简单实例: <!DOCTYPE html> <html lang="en ...
- osg实例介绍
osg实例介绍 转自:http://blog.csdn.net/yungis/article/list/1 [原]osgmotionblur例子 该例子演示了运动模糊的效果.一下内容是转自网上的:原理 ...
- tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍
tcpdump wireshark 实用过滤表达式(针对ip.协议.端口.长度和内容) 实例介绍 标签: 网络tcpdst工具windowslinux 2012-05-15 18:12 3777人阅读 ...
随机推荐
- Spring 梳理 - 视图解析器 VS 视图(View,ViewResolver)
View View接口表示一个响应给用户的视图,例如jsp文件,pdf文件,html文件等 该接口只有两个方法定义,分别表明该视图的ContentType和如何被渲染 Spring中提供了丰富的视图支 ...
- 小鸟初学Shell编程(七)变量引用及作用范围
变量引用 那么定义好变量,如何打印变量的值呢?举例下变量引用的方式. ${变量名}称作为对变量的引用 echo ${变量名}查看变量的值 ${变量名}在部分情况下可以省略成 $变量名 [root@li ...
- PyCharm中创建项目时,在所创建的python虚拟环境下的pip失效
在这篇博文里,我简单地叙述了我在使用PyCharm创建一个flask项目时遇到的问题,以及我解决这个问题的过程.其中比较值得注意的点有:①PyCharm创建新项目时的解释器配置②Python虚拟环境的 ...
- JQuery .width()/.css("width")方法 比较
1. 获取到的值的区别 获取到的为实际宽度,不包括 内边距 和 边框: <div id="aa"> ...... </div> // 1. width() ...
- HTML学习之轮播图
这可以说是一种非常简单的实现轮播图的方法了,由于时间仓促所以没写自动轮播部分.简单说一下原理吧,就是把所有图片堆叠在一个盒子里,设置所有图片的透明度为0,这样就把所有图片都隐藏了,第一张图片除外(第一 ...
- Yii2搭建后台并实现rbac权限控制完整实例教程
.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际 ...
- [UWP] 自定义一个ItemsPanel
在做游民星空的搜索页面的时候,需要展示搜索热点词,返回的是一个string数组的形式,然后以一种错落的方式显示,每一个Item的大小都和热点词长度一致,然后一行放不下之后就换行,描述的不太直观,直接看 ...
- Eclipse的Debug各种视图介绍(二)
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
- python编程基础之十四
列表的增加元素 l1 = [10, 20, 30] l1.append(40) # 末尾追加一个值为40的元素 l1.extend([50, 60]) # 末尾追加一系列元素,extend + 可 ...
- .Net下MoongoDB的简单调用
1.安装.Net 驱动:Install-Package MongoDB.Driver 2.数据插入 //新建Person测试类 public class Person { public long Id ...