Neo4j是什么,Neo4j数据库简介(新手必看)
1852 年,刚从伦敦大学学院毕业的 Francis Gutherie 发现了四色问题。四色问题在一个世纪后被 Kenneth Appel 和 Wolfgang Haken 解决,这被认为是图论真正的诞生。
在计算机领域中,图(Graph)是一种数据结构,由顶点(Vertex)、边(Edge)和属性(Property)组成,其中,顶点也称节点(Node),边也称关系。顶点和边可以设置属性,每个节点和关系可以有一个或多个属性。
Neo4j 是一种图数据库,Cypher 是一种图数据库操作语言。Neo4j 和 Cypher 的命名有一个有趣的来历,Neo 是电影《黑客帝国》中的主角,Cypher 是《黑客帝国》中投靠了机器世界的人类叛徒,而在图数据库 Neo4j 中,Cypher 是 Neo4j 的操作语句,两者互相赋能。
Neo4j 是一个高性能的 NoSQL 图数据库。Neo4j 又是一个嵌入式的、基于磁盘的、具备完全的事务特性的 Java 持久化引擎,可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。
Neo4j分为社区版和企业版,Neo4j 图数据库的查询语言是 Cypher,该语言可以操作和查询属性图。
使用 Neo4j 创建的图是基于属性图这种数据模型的。属性图是有向图,由顶点、边、标签、关系类型和属性组成。在属性图中的所有节点是独立存在的,可以设置标签。拥有相同标签的节点属于一个分组,也就是一个集合。属性图中的关系通过关系类型来分组,类型相同的关系属于同一个集合。节点可以有 0 个、1 个或多个标签,但是关系必须设置关系类型,并且只能设置一个关系类型。关系是有向的,关系的两端分别是起始节点和结束节点,通过有向的箭头来标识方向。节点之间的双向关系通过两个方向相反的关系来标识。在属性图中,节点和关系是重要的实体,每个实体都有唯一标识 ID(Identity)。

图 1 Neo4j节点和关系
节点经常被用来表示一些实体。下面介绍一个简单的节点,该节点只有一个属性,属性名是 name(姓名),属性值是 Marko,如下图所示:

图 2 节点示例
关系示例如下图所示:

图 3 关系示例
一个关系连接两个节点,因此关系必须包含起始节点和结束节点,如下图所示。

图 4 关系

图 5 关系的输入和输出
需要特别注意的是,一个节点可以有一个关系是指向自己的,如下图所示。

图 6 节点
为了便于在将来增强遍历图中所有的关系,需要为关系设置类型(type)。注意,关键字 type 在这里可能会被误解,读者可以把它简单地理解为一个标签。

图 7 社会化网络图
上图展示的是一个有两种关系的社会化网络图。从图 7 中可以看出 Maja、Alice、Oscar 和 William 这 4 个人之间的关系:Alice 是服从(Follow)Oscar 管理的,Oscar 与 Maja 之间是互相 Follow 的平等关系,Oscar 则阻碍(Block)了 William 的发展。

图 8 Linux文件系统
上图展示的是一个简单的 Linux 文件系统,图中表示根目录“/”下有一个子目录 A,而 A 下有目录文件 B 和目录文件 C;B 是文件 D 的符号链接,即可指向 D,而 C 包含 D。从图 8 中可以顺着关系得到根目录下的所有文件信息。

图 9 属性组成关系图

图 10 路径
下图中展示的是一个单独节点,它的路径长度为 0:

图 11 单独节点
下图展示的是长度为 1 的路径:

图 12 长度为 1 的路径
Neo4j 提供了遍历的 API,可以让用户指定遍历规则。一种简单的遍历规则是宽度优先或深度优先。
一台部署了 Neo4j 的服务器可以承载亿级的节点和关系。当然,当单节点服务器无法承载数据需求时,可以部署分布式集群。
在计算机领域中,图(Graph)是一种数据结构,由顶点(Vertex)、边(Edge)和属性(Property)组成,其中,顶点也称节点(Node),边也称关系。顶点和边可以设置属性,每个节点和关系可以有一个或多个属性。
Neo4j 是一种图数据库,Cypher 是一种图数据库操作语言。Neo4j 和 Cypher 的命名有一个有趣的来历,Neo 是电影《黑客帝国》中的主角,Cypher 是《黑客帝国》中投靠了机器世界的人类叛徒,而在图数据库 Neo4j 中,Cypher 是 Neo4j 的操作语句,两者互相赋能。
Neo4j 是一个高性能的 NoSQL 图数据库。Neo4j 又是一个嵌入式的、基于磁盘的、具备完全的事务特性的 Java 持久化引擎,可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。
Neo4j分为社区版和企业版,Neo4j 图数据库的查询语言是 Cypher,该语言可以操作和查询属性图。
Neo4j的结构
在图数据库中,表达数据的方式称为图数据模型,该数据模型对存储效率和查询效率的影响较大。目前使用的图数据模型有两种,分别是属性图和资源描述框架。使用 Neo4j 创建的图是基于属性图这种数据模型的。属性图是有向图,由顶点、边、标签、关系类型和属性组成。在属性图中的所有节点是独立存在的,可以设置标签。拥有相同标签的节点属于一个分组,也就是一个集合。属性图中的关系通过关系类型来分组,类型相同的关系属于同一个集合。节点可以有 0 个、1 个或多个标签,但是关系必须设置关系类型,并且只能设置一个关系类型。关系是有向的,关系的两端分别是起始节点和结束节点,通过有向的箭头来标识方向。节点之间的双向关系通过两个方向相反的关系来标识。在属性图中,节点和关系是重要的实体,每个实体都有唯一标识 ID(Identity)。
1) 节点
构成一张图的基本元素是节点和关系。在 Neo4j 中,节点和关系都可以包含属性,如下图所示。
图 1 Neo4j节点和关系
节点经常被用来表示一些实体。下面介绍一个简单的节点,该节点只有一个属性,属性名是 name(姓名),属性值是 Marko,如下图所示:

图 2 节点示例
2) 关系
节点之间的关系是图数据库很重要的一部分。通过关系可以找到很多关联的数据,如节点集合、关系集合,以及它们的属性集合。关系示例如下图所示:

图 3 关系示例
一个关系连接两个节点,因此关系必须包含起始节点和结束节点,如下图所示。

图 4 关系
因为关系总是直接相连的,所以对于一个节点来说,与它关联的关系有输入和输出两个方向,如下图所示。这个特性对于遍历图非常有帮助。

图 5 关系的输入和输出
需要特别注意的是,一个节点可以有一个关系是指向自己的,如下图所示。

图 6 节点
为了便于在将来增强遍历图中所有的关系,需要为关系设置类型(type)。注意,关键字 type 在这里可能会被误解,读者可以把它简单地理解为一个标签。

图 7 社会化网络图
上图展示的是一个有两种关系的社会化网络图。从图 7 中可以看出 Maja、Alice、Oscar 和 William 这 4 个人之间的关系:Alice 是服从(Follow)Oscar 管理的,Oscar 与 Maja 之间是互相 Follow 的平等关系,Oscar 则阻碍(Block)了 William 的发展。

图 8 Linux文件系统
上图展示的是一个简单的 Linux 文件系统,图中表示根目录“/”下有一个子目录 A,而 A 下有目录文件 B 和目录文件 C;B 是文件 D 的符号链接,即可指向 D,而 C 包含 D。从图 8 中可以顺着关系得到根目录下的所有文件信息。
3) 属性
节点和关系都可以设置自己的属性。在下图所示的属性组成关系图中,一个属性包含键和值两部分,表示属性是由键和值组成的,其中,键指向字符串,表示键是字符串类型;值的类型可以是多样的,如字符串、整型、布尔型等,也可以是 int[] 这种类型。
图 9 属性组成关系图
4) 路径
路径由至少一个节点通过多个关系连接组成,经常作为查询或者遍历的结果,如下图所示:
图 10 路径
下图中展示的是一个单独节点,它的路径长度为 0:

图 11 单独节点
下图展示的是长度为 1 的路径:

图 12 长度为 1 的路径
5) 遍历
遍历一张图就是按照一定的规则,跟随节点之间的关系,访问关联的节点集合。常见的情况是只有一部分子图被访问到,因为用户知道自己关注哪一部分节点或者关系。Neo4j 提供了遍历的 API,可以让用户指定遍历规则。一种简单的遍历规则是宽度优先或深度优先。
Neo4j的优点
Neo4j 包括如下几个显著特点:1) 完整的ACID支持
适当的 ACID 操作是保证数据一致性的基础。Neo4j 保证了事务中多个操作同时发生时数据的一致性。无论是采用嵌入模式还是多服务器集群,Neo4j 都支持这一特性。2) 高可用性和高可扩展性
可靠的图形存储可以非常轻松地被集成到任何一个应用中。随着应用在运营中不断被开发或完善,它的性能问题肯定会逐步凸显出来。无论应用如何变化,Neo4j 只会受到计算机硬件性能的影响,不会受业务本身的约束。一台部署了 Neo4j 的服务器可以承载亿级的节点和关系。当然,当单节点服务器无法承载数据需求时,可以部署分布式集群。