Neo4j - Neo4j概述

Neo4j - Neo4j概述

Neo4j是由 Java 实现的开源 NoSQL 图数据库。Neo4j实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存数据库不同,Neo4j 提供了完整的数据库特性,包括 ACID 事务的支持、集群支持、备份与故障转移等,这使其适合于企业级生产环境下各种应用。

Neo4j 还提供了一些特殊的功能

  • 一个本地化的图数据库:Neo4j 自底向上构建成一个图数据库。它的体系结构旨在优化快速管理、存储和遍历节点和关系。在 Neo4j 中,关系是数据库中最重要的元素,它代表节点之间的相互联系。众所周知,在关系数据库领域中,"关系"适用于多个不同表之间的连接操作,这种操作的性能下降与关系的数量呈指数级别的,但在 Neo4j 中则是用于从一个几点指向另一个节点,其性能却是线性级别的
  • 界面友好:提供了查询与展示的 Web 操作界面。对于图数据模型使用 D3.js 做数据可视化,形象地展示了数据模型的节点和关系
  • 声明式图查询语言:Cypher 是一种声明式图数据库查询语言,它表现力丰富,查询效率高,其地位和作用域关系型数据库中的 SQL 类似,Cypher 还有良好的扩展性,用户可以定制自己的查询方式(如自定义过程)
  • ACID事务:Neo4j 通过 ACID 事务提供真正的数据安全, Neo4j 使用事务来保证输在硬件故障或系统奔溃的情况下不会丢失。
  • 高性能:Neo4j 使用多副本主从复制的方式构建高可靠集群,支持大数据集合并且可以不断扩展其容量,可存储数百万亿个实体,提供了可容错、可扩展的集群,此外Neo4j还提供热备份和性能监控功能
  • 代码开源:Neo4j 将源码公布到GitHub

Neo4j - Neo4j概述_第1张图片

体系结构

揭开 Neo4j 所采用什么样的体系结构

Neo4j 最初的设计动机是为了更好地描述实体之间的联系。现实生活中,每个实体都与周围的其他实体有千丝万缕的关系,这些关系里存在着大量的潜在信息。但是传统的关系型数据库更加注重刻画实体内部属性,实体与实体之间关系通过外键来实现,因此需要大量的 join 操作,而 join 操作通常又非常耗时。随着现实世界中关系的急剧增加,导致关系型数据库已经逐渐地难以承载查询海量数据深层次关系需要大量数据库操作带来复杂性,Neo4j 在这种情况应运而生

免索引邻接

Neo4j 有一个重要的特点,就是用来保证关系查询的速度,既免索引邻接,数据库中每个节点都会维护与它相邻节点的引用。因此每个节点都相当于与它相邻节点的微索引,这比使用全局索引的代价要小很多。这就意味着查询时间和图的整体规模无关,只与它附近节点的数量成正比。在关系型数据库中使用全局索引连接各个节点,这些索引每个遍历都会增加一个中间层,因此会导致非常大的计算成本。而免索引邻接为图数据库提供了快速高效的图遍历能力

对比图

  • RDBMS关系查询示意图

Neo4j - Neo4j概述_第2张图片

  • Neo4j关系查询示意图

Neo4j - Neo4j概述_第3张图片

RDBMS 关系图要查找 Alice 所购买的东西,首先要执行关系表索引查询,时间成本 O(log(n)),n 为索引表的长度。这对于偶尔的浅层次查询是可以接受的,但是当查询的层次变深或者是执行反向查询时代码将变得不可接受。

Neo4j关系图使用了免索引近邻机制,每个节点都有直接或简介指向其相邻节点的指针。要查找 Alice 买过的东西,只需要在Alice 的关系链表中遍历,每次遍历成本为 O(1)

免索引邻接针对 RDBMS 中关系查询两个缺点做了改进

  • 免索引邻接使用遍历物理关系的方法查找,比起全局索引来说代价要小得多。查询一个索引一般的时间复杂度为 O(log(n)),而遍历物理关系的时间复杂度为 O(1),至少对于Neo4j的存储结构来说是如此
  • 当索引建立之后在试图反向遍历时,建立的索引就起不到作用了。我们两个选择:对每个反向遍历的场景创建反向查找索引,或者使用原索引进行暴力搜索,而暴力搜索的时间复杂度为O(n)。这种代价相对于很多需要实时操作的场景来说不可接受的

利用免索引邻接机制,在图数据库上进行关系查找效率非常高,这种高效是建立在图数据库注重关系的架构设计之上的。

基本元素与概念

节点

节点(Node)是图数据库中的一个基本元素,用以表示一个实体记录,就像关系数据库中的一条记录一样。在 Neo4j 中节点可以包含多个属性(Property)和多个标签(Label)

Neo4j - Neo4j概述_第4张图片

这是一个最简单的节点,它只有一个属性,属性名是 name , 属性值是 Tom

关系

关系(Relationship)同样是图数据库中的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也成为图论的边(Edge), 其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,单关系只能有一个类型(Type)

Neo4j - Neo4j概述_第5张图片

一个节点可以被多个关系指向或作为关系的起始关系

Neo4j - Neo4j概述_第6张图片

多个关系指向同一个节点

Neo4j - Neo4j概述_第7张图片

关系必须有开始节点(Start node) 和结束节点(End node),两头都不能为空

Neo4j - Neo4j概述_第8张图片

由于关系是有方向的,所以可在由几点、关系组成的图中进行遍历

属性

上面提到节点和关系都可以有多个属性。属性是有键值对组成的,就像 Java 的哈希表咿呀,属性名类似变量名,属性值类似变量值。属性值可以是基本的数据类型,或者由基本数据类型组成的数组

Neo4j - Neo4j概述_第9张图片

路径

当是有节点和关系创建一个图后,在此图中任意两个几点间都是可能存在路径的

Neo4j - Neo4j概述_第10张图片

任意两节点都存在由节点和关系组成的路径,路径也有长度的概念,也就是路径中关系的条数,当然也可以说单独一个节点就可以组成长度为0的路径

Neo4j - Neo4j概述_第11张图片

遍历

遍历一张图就是按照一定规则,根据它们之间的关系,依次访问是有相关联的节点的操作。

对于遍历操作不必自己实现,因为 Neo4j 提供了一套高效的遍历 API ,可以指定遍历规则,然后让 Neo4j 自动按照遍历规则遍历并返回遍历的结果。遍历规则可以是广度优先,也可以是深度优先

你可能感兴趣的:(Neo4j,数据库,database)