ArangoDB教程(二)-AQL语句使用,图使用,结合WEB界面端
一.ArangoDB基本单元
1.Collections
Collections相当于传统数据库的表,Collections有两种类型(不要和数据document混淆)
(1)document collection图的节点
(2)edge collection图的边
和document类型相比,多出_from和_to属性,表示两个document之间的联系,换句话说就是:
document collection的两个节点documents,通过edge collection边document来相连。
2.document文档
document 相当于传统数据库每一行数据,JSON格式,并自带3个属性,_key,_id,_rev
比如
{"_key": "2861650", //每个document的唯一标识,用于在collection集合中标识它,如果不设置的话会自动分配"_id": "Characters/2861650", //用于在database数据库中标识文档"_rev": "_V1bzsXa---", //对document的修订版本"name": "Ned","surname": "Stark","alive": true,"age": 41,"traits": ["A","H","C","N","P"]
},
二.AQL语句使用
1.查询document
通过_key获取
RETURN DOCUMENT("Characters", "2861650")
通过_id获取
RETURN DOCUMENT("Characters/2861650")
获取所有表中所有数据
FOR c IN CharactersRETURN c
条件查询
FOR c IN CharactersFILTER c.name == "Ned"RETURN c
FOR c IN CharactersFILTER c.name == "Ned"RETURN c.age
FOR c IN CharactersFILTER c.age < 13 AND c.age != nullRETURN { name: c.name, age: c.age }
FOR c IN CharactersFILTER c.age < 13 AND c.age != nullRETURN { name: c.name, age: c.age }
限制查询的条数
FOR c IN CharactersLIMIT 5RETURN c.name
排序
此语句是先对name进行了排序,然后再进行Limit 10
FOR c IN CharactersSORT c.nameLIMIT 10 RETURN c.name
2.插入ducument
单条document数据插入
INSERT {"name": "Robert","surname": "Baratheon","alive": false,"traits": ["A","H","C"]
} INTO Characters
多条document数据插入
LET data = [{ "name": "Robert", "surname": "Baratheon", "alive": false, "traits": ["A","H","C"] },{ "name": "Jaime", "surname": "Lannister", "alive": true, "age": 36, "traits": ["A","F","B"] },{ "name": "Catelyn", "surname": "Stark", "alive": false, "age": 40, "traits": ["D","H","C"] },{ "name": "Cersei", "surname": "Lannister", "alive": true, "age": 36, "traits": ["H","E","F"] },{ "name": "Daenerys", "surname": "Targaryen", "alive": true, "age": 16, "traits": ["D","H","C"] },{ "name": "Jorah", "surname": "Mormont", "alive": false, "traits": ["A","B","C","F"] },{ "name": "Petyr", "surname": "Baelish", "alive": false, "traits": ["E","G","F"] },{ "name": "Viserys", "surname": "Targaryen", "alive": false, "traits": ["O","L","N"] },{ "name": "Jon", "surname": "Snow", "alive": true, "age": 16, "traits": ["A","B","C","F"] },{ "name": "Sansa", "surname": "Stark", "alive": true, "age": 13, "traits": ["D","I","J"] },{ "name": "Arya", "surname": "Stark", "alive": true, "age": 11, "traits": ["C","K","L"] },{ "name": "Robb", "surname": "Stark", "alive": false, "traits": ["A","B","C","K"] },{ "name": "Theon", "surname": "Greyjoy", "alive": true, "age": 16, "traits": ["E","R","K"] },{ "name": "Bran", "surname": "Stark", "alive": true, "age": 10, "traits": ["L","J"] },{ "name": "Joffrey", "surname": "Baratheon", "alive": false, "age": 19, "traits": ["I","L","O"] },{ "name": "Sandor", "surname": "Clegane", "alive": true, "traits": ["A","P","K","F"] },{ "name": "Tyrion", "surname": "Lannister", "alive": true, "age": 32, "traits": ["F","K","M","N"] },{ "name": "Khal", "surname": "Drogo", "alive": false, "traits": ["A","C","O","P"] },{ "name": "Tywin", "surname": "Lannister", "alive": false, "traits": ["O","M","H","F"] },{ "name": "Davos", "surname": "Seaworth", "alive": true, "age": 49, "traits": ["C","K","P","F"] },{ "name": "Samwell", "surname": "Tarly", "alive": true, "age": 17, "traits": ["C","L","I"] },{ "name": "Stannis", "surname": "Baratheon", "alive": false, "traits": ["H","O","P","M"] },{ "name": "Melisandre", "alive": true, "traits": ["G","E","H"] },{ "name": "Margaery", "surname": "Tyrell", "alive": false, "traits": ["M","D","B"] },{ "name": "Jeor", "surname": "Mormont", "alive": false, "traits": ["C","H","M","P"] },{ "name": "Bronn", "alive": true, "traits": ["K","E","C"] },{ "name": "Varys", "alive": true, "traits": ["M","F","N","E"] },{ "name": "Shae", "alive": false, "traits": ["M","D","G"] },{ "name": "Talisa", "surname": "Maegyr", "alive": false, "traits": ["D","C","B"] },{ "name": "Gendry", "alive": false, "traits": ["K","C","A"] },{ "name": "Ygritte", "alive": false, "traits": ["A","P","K"] },{ "name": "Tormund", "surname": "Giantsbane", "alive": true, "traits": ["C","P","A","I"] },{ "name": "Gilly", "alive": true, "traits": ["L","J"] },{ "name": "Brienne", "surname": "Tarth", "alive": true, "age": 32, "traits": ["P","C","A","K"] },{ "name": "Ramsay", "surname": "Bolton", "alive": true, "traits": ["E","O","G","A"] },{ "name": "Ellaria", "surname": "Sand", "alive": true, "traits": ["P","O","A","E"] },{ "name": "Daario", "surname": "Naharis", "alive": true, "traits": ["K","P","A"] },{ "name": "Missandei", "alive": true, "traits": ["D","L","C","M"] },{ "name": "Tommen", "surname": "Baratheon", "alive": true, "traits": ["I","L","B"] },{ "name": "Jaqen", "surname": "H'ghar", "alive": true, "traits": ["H","F","K"] },{ "name": "Roose", "surname": "Bolton", "alive": true, "traits": ["H","E","F","A"] },{ "name": "The High Sparrow", "alive": true, "traits": ["H","M","F","O"] }
]FOR d IN dataINSERT d INTO Characters
3.更新和替换document
更新,根据_key
UPDATE "2861650" WITH { alive: false } IN Characters
替换
REPLACE "2861650" WITH {name: "Ned",surname: "Stark",alive: false,age: 41,traits: ["A","H","C","N","P"]
} IN Characters
新增属性
FOR c IN CharactersUPDATE c WITH { season: 1 } IN Characters
4.删除document
单条删除
REMOVE "2861650" IN Characters
批量删除
FOR c IN CharactersREMOVE c IN Characters
5.MERGE(),collection之间的document关联
假如现在让Characters的traits字段和Traits中的数据相关联
创建collection集合 Traits
然后再导入数据
LET data =[{ "_key": "A", "en": "strong", "de": "stark" },{ "_key": "B", "en": "polite", "de": "freundlich" },{ "_key": "C", "en": "loyal", "de": "loyal" },{ "_key": "D", "en": "beautiful", "de": "schön" },{ "_key": "E", "en": "sneaky", "de": "hinterlistig" },{ "_key": "F", "en": "experienced", "de": "erfahren" },{ "_key": "G", "en": "corrupt", "de": "korrupt" },{ "_key": "H", "en": "powerful", "de": "einflussreich" },{ "_key": "I", "en": "naive", "de": "naiv" },{ "_key": "J", "en": "unmarried", "de": "unverheiratet" },{ "_key": "K", "en": "skillful", "de": "geschickt" },{ "_key": "L", "en": "young", "de": "jung" },{ "_key": "M", "en": "smart", "de": "klug" },{ "_key": "N", "en": "rational", "de": "rational" },{ "_key": "O", "en": "ruthless", "de": "skrupellos" },{ "_key": "P", "en": "brave", "de": "mutig" },{ "_key": "Q", "en": "mighty", "de": "mächtig" },{ "_key": "R", "en": "weak", "de": "schwach" }
]for d in dataINSERT d INTO Traits
只关注traits字段和只拿en关联
FOR c IN CharactersRETURN MERGE(c, { traits: DOCUMENT("Traits", c.traits)[*].en })
结果
{"_id": "Characters/7839","_key": "7839","_rev": "_YFmCBwS--_","alive": false,"name": "Robert","surname": "Baratheon","traits": ["strong","powerful","loyal"]}
traits字段和en,de关联
FOR c IN CharactersRETURN MERGE(c, { traits: (for t in DOCUMENT("Traits", c.traits) RETURN {en:t.en,de:t.de})} )
结果
{"_id": "Characters/7839","_key": "7839","_rev": "_YFmCBwS--_","alive": false,"name": "Robert","surname": "Baratheon","traits": [{"en": "strong","de": "stark"},{"en": "powerful","de": "einflussreich"},{"en": "loyal","de": "loyal"}]
}
6.图的建立
比如父母和孩子之间有以下关系:
首先创建ChildOf的新集合,集合类型为Edge document
Edge的_from和_to的内容必须为document的_id,运行一下代码,生成图关系
LET data = [{"parent": { "name": "Ned", "surname": "Stark" },"child": { "name": "Robb", "surname": "Stark" }}, {"parent": { "name": "Ned", "surname": "Stark" },"child": { "name": "Sansa", "surname": "Stark" }}, {"parent": { "name": "Ned", "surname": "Stark" },"child": { "name": "Arya", "surname": "Stark" }}, {"parent": { "name": "Ned", "surname": "Stark" },"child": { "name": "Bran", "surname": "Stark" }}, {"parent": { "name": "Catelyn", "surname": "Stark" },"child": { "name": "Robb", "surname": "Stark" }}, {"parent": { "name": "Catelyn", "surname": "Stark" },"child": { "name": "Sansa", "surname": "Stark" }}, {"parent": { "name": "Catelyn", "surname": "Stark" },"child": { "name": "Arya", "surname": "Stark" }}, {"parent": { "name": "Catelyn", "surname": "Stark" },"child": { "name": "Bran", "surname": "Stark" }}, {"parent": { "name": "Ned", "surname": "Stark" },"child": { "name": "Jon", "surname": "Snow" }}, {"parent": { "name": "Tywin", "surname": "Lannister" },"child": { "name": "Jaime", "surname": "Lannister" }}, {"parent": { "name": "Tywin", "surname": "Lannister" },"child": { "name": "Cersei", "surname": "Lannister" }}, {"parent": { "name": "Tywin", "surname": "Lannister" },"child": { "name": "Tyrion", "surname": "Lannister" }}, {"parent": { "name": "Cersei", "surname": "Lannister" },"child": { "name": "Joffrey", "surname": "Baratheon" }}, {"parent": { "name": "Jaime", "surname": "Lannister" },"child": { "name": "Joffrey", "surname": "Baratheon" }}
]FOR rel in dataLET parentId = FIRST(FOR c IN CharactersFILTER c.name == rel.parent.nameFILTER c.surname == rel.parent.surnameLIMIT 1RETURN c._id)LET childId = FIRST(FOR c IN CharactersFILTER c.name == rel.child.nameFILTER c.surname == rel.child.surnameLIMIT 1RETURN c._id)FILTER parentId != null AND childId != null//顶点和边相连INSERT { _from: childId, _to: parentId } INTO ChildOfRETURN NEW
FIRST()从数据中取第一个元素
NEW/OLD,NEW表示更改后的document,OLD表示更改之前的document
我们完成了关系的建立,尝试从关系中获取数据
查看关系图
FOR c IN ChildOfRETURN c
但发现关系图的顶点都是用id表示,不易看清楚,可以使用以下语句查看
FOR c IN ChildOf//CONCAT(c._from,DOCUMENT(c._from).name)RETURN {_key:c._key,_id:c._id,_from:DOCUMENT(c._from).name,_to:DOCUMENT(c._to).name,_rev:c._rev}
对图的使用
从孩子找父母
FOR c IN CharactersFILTER c.name == "Bran"//1..1分别表示最小最大遍历深度,OUTBOUND表示沿着边的方向,INBOUND表示反方向FOR v IN 1..1 OUTBOUND c ChildOfRETURN v.name
从父母找孩子
FOR c IN CharactersFILTER c.name == "Ned"FOR v IN 1..1 INBOUND c ChildOfRETURN v.name
ArangoDB教程(二)-AQL语句使用,图使用,结合WEB界面端相关推荐
- 华为昇腾系列开发入门教程二:开局一张图,手把手教你鉴“XX”
编 | 章磊 啊,上篇文章发布后,得到了数以百亿计的隐形网友疯狂转发和点赞,鄙人甚至能YY出他们用鼠标摁下"
- ASP .NET Core Web MVC系列教程:使用ASP .NET Core创建MVC Web应用程序
本系列教程翻译自微软官方教程,官方教程地址:Get started with ASP.NET Core MVC | Microsoft Docs 本系列教程介绍了构建MVC Web应用程序的基础知识. ...
- 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星 ...
- 【Visual C++】游戏开发五十二 浅墨DirectX教程二十 骨骼动画来袭(一)
这是答应大家的讲解骨骼动画的文章的N部曲的第二篇.这篇文章里,我们对现行的三种模型动画技术进行了概述,然后对X文件构成进行了详细的剖析,最后放出了骨骼动画的第一个示例程序,载入了<诛仙>中 ...
- 【Visual C++】游戏开发五十二 浅墨DirectX教程二十 骨骼动画来袭(一)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8832812 作者:毛星云(浅墨 ...
- 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计 公告板 Billboard 技术
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计:公告板(Billboard)技术...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨) 微博:@浅墨_毛星云邮箱: happylifemxy@163.com I'm back~,这段时间大家久等了~ ...
- 【Visual C++】游戏开发五十七 浅墨DirectX教程二十四 打造游戏GUI界面(二)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/16922703 作者:毛星 ...
- 【Visual C++】游戏开发五十五 浅墨DirectX教程二十二 水乳交融的美学:alpha混合技术
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/15026917 作者:毛星 ...
- C#开发Unity游戏教程之判断语句
C#开发Unity游戏教程之判断语句 游戏执行路径的选择--判断 玩家在游戏时,无时无刻不在通过判断做出选择.例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏 ...
最新文章
- Dump File Bat
- android popupwindow dialog区别,Android PopUpWindow使用详解
- python中的gui界面编程_python应用系列教程——python的GUI界面编程Tkinter全解
- easyui 转换 html5,easyUI Tabs
- android倒计时录制视频下载,android录制视屏(预览,倒计时)
- 并查集 - 由斜杠划分区域
- 数据结构与算法之选择排序
- 1张手稿图讲明白 Kubernetes 是怎么运行的
- c语言学习自我评价,学习自我评价4篇
- 你确定你会使用git commit?
- 涅槃重生的下一个超级风口:8本书助你赢在未来
- python自带的和numpy带的all(),any() 来判断各空矩阵和零矩阵 None,以及shape
- K - Repeating Decimals(循环小数)
- C语言—gotoxy()函数
- 数据挖掘案例:建立客户流失模型
- 前端之JavaScript入门篇
- 《数字信号处理》——(一).DTFT、DFT(python实现)
- Java调用soap协议的webservice
- [案例7-2]商城进货交易记录
- Linux系统访问Windows(本机)的Navicat数据库