ArangoDB基础介绍

2022-04-08 00:00:00 查询 数据 文档 节点 遍历

ArangoDB多模态数据库的介绍和分享
ArangoDB是一款储存文档、图形并提供查询的多模型数据库,支持键值对、文档和图形模式的数据储存。在这片文章里,我会着重对图数据方面的信息进行分析和介绍。如果对基础功能的使用还有疑问的小伙伴,可以自行去官网进行资料的查阅。迷路的小伙伴可以->点击这里

本文使用的arangoDB主要版本为3.6,但是会介绍一些3.7版本便于使用的功能,其中3.7的功能均在beta版中进行了测试(目前官方还没有推出3.7的正式版),等正式版出了会在进行更新和整理。3.7的功能部分仅供参考。

一、基本概念
首先,在接触ArangoDB的时候,你需要了解这个数据库的一些基本划分和概念
AQL:arangodb的查询语言,可与类似于SQL。
Collections:分成Docunment和Edge两种类型,分别储存文档和边的信息
Document:可以储存一条记录,每一条类似于一个neo4j的节点
Edge:可以储存一条记录,与document不同,edge储存的是节点之间的关系(带有_from和_to)
graph:根据指定的一个或多个document和edge进行结合,组成一个graph
View:视图、对collections中的文档建立视图,已用来提供arangosearch的查询

二、基本功能(CRUD)
2.1 新增
insert的使用

在指定数据库中新增一条数据(可以是节点或者关系,根据新增的内容不同填充必要的字段,这里以节点为例)

INSERT { “_key”: “1”, “_id”: “test/1”, “name”: “test1”, “id”: “9f8a12152a844671aa9c9c7021303fcc”, “sample”: “弦酿坭苛忒蜩铬难怩遇汗昂浩筷烯母浑伫娠甄咀展郏帘岣晾拐捂妊幢胫镝蟓酉杓圻藤缱哑守陕锸焖桑狂写驹漾黯”, “time”: “2020-02-24 16:40:30” } INTO test
1
新增之后,我们可以看到这样一条数据


其中,_key为数据文档中这一条数据的键,不指定的话会默认生成一个,而_id则为表名和key的结合,_rev为系统管理的版本(revision id)。

2.2 修改
update的使用

update “1” with { “name”: “updateTest” } in test


replace的使用

replace “1” with{ “_key”: “1”, “_id”: “test/1”, “name”: “replaceTest”, “id”: “9f8a12152a844671aa9c9c7021303fcc”, “sample”: “弦酿坭苛忒蜩铬难怩遇汗昂浩筷烯母浑伫娠甄咀展郏帘岣晾拐捂妊幢胫镝蟓酉杓圻藤缱哑守陕锸焖桑狂写驹漾黯” } in test


用replace字段的话会将原来的数据删除掉,将新的填充进去,而不是只替换输入的参数

2.3 删除
remove的使用

REMOVE “1” IN test
1
根据key对文档中相应的一条数据进行删除

2.4 查询
根据id在文档内进行记录查找

return document (“test”, “1”)


2.5 for语句
用for语句对文档内的所有文档进行遍历查询

for node in test return node


2.6 limit的使用
for node in test limit 1 return node
1
limit关键词要放在return前面


2.7 filter的使用
filter作为aql语句中的筛选条件,和sql相同,放在句中,如:

for node in test filter node.name == “replaceTest” return node
1
当查询一条记录(一个节点)的时候,可以有一个或者多个筛选条件,这是可以用多个filter进行过滤,如:

for node in test filter node.name == “replaceTest” filter node.id =~ “1” return node


或者也可以根据需要用and、or进行连接,如:

for node in test filter node.name == “replaceTest” and node.id =~ “1” return node
1
2.8 Collection的使用
2.8.1 用于计数
在数据库的使用中,常见的一个操作就是count了,那么在arangodb中怎么针对查询出来的结果进行计数呢

for node in test collection with count into number return number
1
如果需要对文档进行过滤则可以将filter拼接进去

三、图查询介绍
图查询是建立在collections中的节点文档(document)和关系文档(edge),一个图可以包含一个或多个节点文档和关系文档的组合。每一组关系文档需要声明起始节点所在文档和结束节点所在文档

3.1 基本图查询
for v in 1..1 any “baiwan/1” graph “baiwantest” return v
1
语句中1…1是指根据节点查询周边一层
baiwan/1是指其实节点的key为“baiwan/1”
any是指根据节点进行双向查询,如果单项查询可以根据需求使用outbound和inbound。
baiwantest为图名称
改语句的返回值为改节点周边一层的所有节点信息


同理,图查询的时候也可以添加filter作为过滤的条件,如

for v in 1..1 any “baiwan/1” graph “baiwantest” filter v.name == “test759036” return v
1
3.2 图查询语句属性介绍
图查询时可以通过 for v,e,p 的方式指定返回结果,v代表了节点数据,e代表了边数据,p代表了整个路径((v)-[e]-(v))。

3.3 图查询中的with使用
可以指定节点的结合列表,放在语句的开头, 如:

[WITH vertexCollection1[, vertexCollection2[, ...vertexCollectionN]]]
FOR v,e,p ......
3.4 图查询中的collections的使用
在查询图结构时。可以使用collection对变量进行赋值返回,并且根据需要可以进行分组统计等操作

for e in event
for node1,relation1,path1 in 1..1 any e graph 'graph'
filter '新闻' in node1.labels
for node2,relation2,path2 in 1..1 any node1 graph 'graph'
filter '评论' in node2.labels
collect event = e,
news = node1 with count into number
sort number desc
return {'event':event, 'news':news, 'number': number}

3.5 图语句查询参数配置(options)
3.5.1 bfs
是否使用宽度优先遍历算法
true: 宽度遍历优先
false:深度遍历优先
3.5.2 uniqueVertices
认定遍历时节点性

“None”: 不做任何限制。(默认)
针对于超级节点会经常导致内存溢出的情况,arangodb在图查询中没有做任何的去重操作。会有很多很多很多很多很多很多很多很多重复和操作。

“path”: 所有遍历的路径中没有重复的节点。
个人理解像针对于路径的去重,但是对于终返回的结果如果有多条路径的话还是会有重复的情况,比如在如下图形关系中:


如果指定了path属性的话, 结果会返回两条路径:a->b->d 和 a->c->d

-“global”: 在遍历的过程中每个节点只保证遍历一次。如果使用了这个参数,在查询的时候有些路径可能会丢失,所以应该在只对结束节点有查询要求时使用该参数。如上图所示,如果使用改参数则只会返回a->b->d路径。
使用该方法的有点是针对于超级节点的多层图查询,可以极大的减小程序运行内存的压力,因为这个去重工作是在将数据放入内存前进行的,所以如上图,只有a->b->d数据会保存在内存中

3.5.3 uniqueEdges
“Path”: 每个边只会遍历一遍。(默认)
“None”: 不做任何限制。(不要用,可能会导致边的循环:转圈圈~)
以下功能在3.7以上才可以使用
3.5.4 edgeCollections
指定参与的边缘文档集合
3.5.5 vertexCollections
指定参与的节点文档集合
3.5.6 parallelism
并发设置: 如果省略或设置为1,遍历执行就不会并行化。如果设置为大于1的值,那么可以使用多的工作线程并发地执行遍历。这个值的上限是目标机器上可用内核的数量。

相关文章