图数据库
什么是图数据库
图数据库源起欧拉和图理论,也可称为面向/基于图的数据库,对应的英文是Graph Database。图数据库的基本含义是以“图”这种数据结构存储和查询数据,而不是存储图片的数据库。它的数据模型主要是以节点和关系(边)来体现,也可处理键值对。它的优点是快速解决复杂的关系问题
图数据库名字的由来其实与其在底层的存储方式有关,Neo4j底层会以图的方式把用户定义的节点以及关系存储起来,通过这种方式,可是高效的实现从某个节点开始,通过节点与节点间关系,找出两个节点间的联系。
从这段描述中可以猜得到,在Neo4j中最重要的两个元素就是节点和关系。说到节点和关系,就必须引出一个非常重要的概念,属性图模型(Property Graph Model)。如下所示:

一个图中会记录节点和关系
关系可以用来关联两个节点
节点和关系都可以拥有自己的属性
可以赋予节点多个标签(类别)
图数据库有哪些特征?
1.包含节点和边;
2.节点上有属性(键值对);
3.边有名字和方向,并总是有一个开始节点和一个结束节点;
4.边也可以有属性。
开源图数据库
5个优秀的开源图数据库
1.Neo4j社区版
2.HyperGraphDB
3.Titan分布式图数据库
4.ArangoDB
5.Apache TinkerPop
golang graphdb
Dgraph
查询语言
图数据库是使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。
虽然和关系型数据库存储的结构不同(关系型数据库为表结构,图数据库为图结构),但不计各自的性能问题,关系型数据库可以通过递归查询或者组合其他 SQL 语句(Join)完成图查询语言查询节点关系操作。得益于 1987 年 SQL 成为国际标准化组织(ISO)标准,关系型数据库行业得到了很好的发展。同 60、70 年代的关系型数据库类似,图数据库这个领域的查询语言目前也没有统一标准,虽然 19 年 9 月经过国际 SQL 标准委员会投票表决,决定将图查询语言(Graph Query Language)纳为一种新的数据库查询语言,但 GQL 的制定仍需要一段时间。
术语 | Gremlin | Cypher | nGQL |
---|---|---|---|
点 | Vertex | Node | Vertex |
边 | Edge | Relationship | Edge |
点类型 | label | RelationshipType | edge type |
点 ID | vid | id(n) | vid |
边 ID | eid | id® | 无 |
图查询语言 Gremlin
Gremlin 是 Apache ThinkerPop 框架下的图遍历语言。Gremlin 可以是声明性的也可以是命令性的。虽然 Gremlin 是基于 Groovy 的,但具有许多语言变体,允许开发人员以 Java、JavaScript、Python、Scala、Clojure 和 Groovy 等许多现代编程语言原生编写 Gremlin 查询。
支持图数据库:Janus Graph、InfiniteGraph、Cosmos DB、DataStax Enterprise(5.0+) 、Amazon Neptune
图查询语言 Cypher
Cypher 是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询,和 SQL 很相似,Cypher 语言的关键字不区分大小写,但是属性值,标签,关系类型和变量是区分大小写的。
支持图数据库: Neo4j、RedisGraph、AgensGraph
图查询语言 nGQL
nGQL 是一种类 SQL 的声明型的文本查询语言,nGQL 同样是关键词大小写不敏感的查询语言,目前支持模式匹配、聚合运算、图计算,可无嵌入组合语句
支持图数据库:Nebula Graph
图数据库最常使用的场景
- 社交网络应用
- 实时推荐
- 地理空间管理
- 网络和数据中心管理
- 授权和访问控制
Ref
开源NoSQL数据库ArangoDB浅析
图数据库——大数据时代的高铁
5个优秀的开源图数据库
图数据库介绍
图数据库查询语言
arangodb
start
$ docker run -p 8529:8529 -e ARANGO_ROOT_PASSWORD=openSesame arangodb/arangodb:3.6.4
$ docker run –rm -it -p 8529:8529 -e ARANGO_ROOT_PASSWORD=openSesame -v ~/arangodb3:/var/lib/arangodb3 arangodb/arangodb:3.6.4
arangodb: database -> collection -> document
rdbms: database -> table -> row
1 | FOR doc IN collection |
neo4j
run
1 | docker run \ |
操作
创建
CREATE (p:Person {name: ‘admin’}) RETURN p
查找
MATCH (p:Person) RETURN p
MATCH (p)-[:DIRECTED]->(m) RETURN p,m
删除(删除时node存在关系必须删除关系,否则报错)
MATCH (p:Person)
WHERE id(p) = 1
DELETE p
RETURN p
已存在node创建relation
MATCH (p1:Person)
WHERE id(p1) = 1
MATCH (p2:Person)
WHERE id(p2) = 2
CREATE (p1)-[:like]->(p2)
RETURN p1,p2
更新
MATCH (p1:Person)
WHERE id(p1) = 1
SET p1.name = ‘alex’
RETURN p1