前言
第一次听到Neo4j,是在前天,我接到了一个task,自己造一个Neo4j的服务,并用docker搭建一个Neo4j的服务器。这两天学习了一下Neo4j,本来不打算写Neo4j的博客了,造完服务就算了,但是越是到后面,越是觉得自己对Neo4j中的一些概念理解的不够透彻,从而直接影响了我的进度,我有了很多的疑惑。“理论支撑实践”,果然是至理名言,就像当年读书的时候,老师反反复复强调数据结构等一系列理论课很重要是一样的道理。遂此刻,回头整理知识点,还是那句话,温故而知新,每一次的重新阅读,都会有不一样的收获。
简介
作为一款强健的,可伸缩的高性能数据库,Neo4j最适合完整的企业部署或者用于一个轻量级项目中完整服务器的一个子集存在。
它包括如下几个显著特点:
1.完整的ACID支持
2.高可用性
3.轻易扩展到上亿级别的节点和关系
4.通过遍历工具高速检索数据
适当的ACID操作是保证数据一致性的基础。Neo4j确保了在一个事务里面的多个操作同时发生,保证数据一致性。不管是采用嵌入模式还是多服务器集群部署,都支持这一特性。
可靠的图型存储可以非常轻松的集成到任何一个应用中。随着我们开发的应用在运营中不断发展,性能问题肯定会逐步凸显出来,而Neo4j不管应用如何变化,他只会受到计算机硬件性能的影响,不受业务本身的约束。部署一个neo4j服务器便可以承载上亿级的节点和关系。当然,当单节点无法承载我们的数据需求时,我们可以进行分布式集群部署。将图数据库用于存储关系复杂的数据是他最大的优势。通过Neo4j提供的遍历工具,可以非常高效的进行数据检索,每秒可以达到上亿级的检索量。一个检索操作类似于RDBMS里面的连接(join)操作。
什么是图数据库?
Neo4j是世界领先的开源图形数据库。 它完全由使用Java语言通过新技术的发展。
一个开源
Schema的*
没有SQL(Neo4j是使用CQL)
图形数据库
图形数据库也被称为图形数据库管理系统或GDBMS。
官方网站:http://www.neo4j.org
从关系型数据库(RDBMS)到图数据库(GDBMS)
图数据库是在图形结构的形式存储数据的数据库。 它存储在节点,关系和属性方面我们的应用程序的数据。 就像在表的“行,列”的形式的RDBMS存储数据,GDBMS在“图”的形式存储数据。
Relationships是图数据库中的很重要的部分(first-class citizens),不同于其他的数据库管理系统,图数据库连接两个实体(entities)是通过properties(属性),你可以类比于关系型数据库中的外键(foreign key)。通过组合简单抽象的nodes(节点)和relationships(关系)形成了一种连接结构,GDBMS让我们可以构建复杂的模型来映射我们所的问题域。
Neo4j的特点
SQL一样容易查询语言的Neo4j CQL
它遵循属性图数据模型
它通过使用Apache Lucence支持索引
它支持UNIQUE约束
它包含一个UI执行CQL指令:Neo4j的数据浏览器
它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
它采用原生图形库与本地GPE(图形处理引擎)
它支持查询的数据导出到JSON和XLS格式
它提供了REST API由如Java,Spring等任何编程语言进行访问
它提供了Java Script支持以任何UI MVC框架如Node JS进行访问。
它支持两种类型的Java API:Cypher支架API和本地Java API来开发Java应用程序。
优势
这是很容易以表示连接数据。
这是很容易和更快的检索更多的数据/遍历/导航。
它表示半结构化数据变得非常容易。
Neo4j的CQL查询语言命令在人性化的可读格式,非常简单易学。
它使用简单,功能强大的数据模型。
它不需要复杂的连接来获取连接/相关的数据,因为它是非常方便地检索它的相邻节点或关系的细节没有加入或索引。
缺点
它具有支持节点,关系和属性的数量的限制。
它不支持拆分。
Neo4j数据模型
如下如所示
这是我们从neo4j的管理端看到现有数据的关系,一个简单的图(graph),由此图引出Neo4j中很重要的三个概念:
Node: 图一中的圆点就是节点,图二中出现的MOVIEWS、USERS是节点的类型,用Label表示
Relationship: 图一中有方向的直线就是关系,HAS_SEEN、IS_FRIEND_OF表示两种不同关系
Property: Node和Relationship都会有属性,比如USERS类型的Node有属性name,用以表示人名(name:Kate Smith);关系HAS_SEEN有属性star,用以表示对该电影的评分(star:5)
模型规则
三个要素:节点(node)、关系(relationship)、属性(property)
这两个节点和关系所包含的属性
关系连接节点
属性是键值对
节点用圆和关系使用箭头键各自的代表。
关系是有方向的:单向和双向。
每个关系包含“开始节点”或者“从节点”和“节点”或“端节点”
节点(Node)
构成一张图的基本元素是节点和关系。在Neo4j中,节点和关系都可以包含属性。 节点经常被用于表示一些实体,但依赖关系也一样可以表示实体。
关系(Relationship)
节点之间的关系是图数据库很重要的一部分。通过关系可以找到很多关联的数据,比如节点集合,关系集合以及他们的属性集合。
一个关系连接两个节点,必须有一个开始节点和结束节点。
因为关系总是直接相连的,所以对于一个节点来说,与他关联的关系看起来有输入/输出两个方向,这个特性对于我们遍历图非常有帮助:
关系在任一方向都会被遍历访问。这意味着我们并不需要在不同方向都新增关系。
而关系总是会有一个方向,所以当这个方向对你的应用没有意义时你可以忽略方向。
特别注意一个节点可以有一个关系是指向自己的:
为了将来增强遍历图中所有的关系,我们需要为关系设置类型。注意 关键字 type 在这可能会被误解,你其实可以把他简单的理解为一个标签而已。
属性(Property)
节点和关系都可以设置自己的属性。 属性是由Key-Value键值对组成,键名是字符串。属性值是要么是原始值,要么是原始值类型的一个数组。比如String、int和int[]都是合法的。
注意
null不是一个合法的属性值。 Nulls能代替模仿一个不存在的Key。
路径(Path)
路径由至少一个节点,通过各种关系连接组成,经常是作为一个查询或者遍历的结果。
最短的路径是0长度的像下面这样:
长度为1的路径如下:
遍历(Traversal)
遍历一张图就是按照一定的规则,跟随他们的关系,访问关联的的节点集合。最多的情况是只有一部分子图被访问到,因为你知道你对那一部分节点或者关系感兴趣。
Neo4j提供了遍历的API,可以让你指定遍历规则。最简单的设置就是设置遍历是广度优先还是深度优先。后面我会花很多篇幅详细介绍。