Neo4j学习笔记

第1章 Neo4j数据库的一个应用案例

Neo4j将数据作为顶点和边存储(或者用Neo4j术语,节点和关系存储)。关系数据库和Neo4j图形数据库的重要区别是数据查询。在Neo4j图形数据库中,没有表和列的概念,也没有基于SQL的select和join命令。那么Neo4j如何查询图形数据库呢?

答案并不是“写一个分布式的MapReduce函数”。像所有的图形数据库一样,Neo4j借用图论的强大数学概念,并作为一个强大和高效率的引擎用于查询数据。这个概念就是图形遍历,图形遍历是使Neo4j具有强大处理大型图形数据的主要工具之一。

Neo4j提供了丰富的遍历应用程序接口(API),可以用于在图形数据库中漫游。此外,还可以使用REST API或Neo4j的查询语言遍历数据。

Neo4j性能的可预期性的主要原因是图形遍历的局部性,不管图形中有多少个节点和关系,根据遍历规则,遍历将仅仅访问那些连接到起始节点的节点。请记住,关系数据库的join操作计算笛卡儿积并丢弃不相关的结果,随着数据集的增大,将按指数变化影响其性能。然而,Neo4j只访问与遍历相关的节点,所以能够不受总数据集大小的影响,从而保持期待的性能。要遍历访问的节点越多,遍历就会越慢,正如当增加深度时所见到的。但是,这种变慢是线性的,而且仍然不受总图形大小的影响。

Neo4j的速度秘密在哪里?

秘密就在数据结构中——图形的局部性使得遍历的速度非常快。假设你要在一个当地的小足球场为你的球队加油。如果有人问你坐在你身边15英尺以内有多少人,你会站起来,并以最快的速度数一数你身边的人。现在设想你在国家足球场看比赛,有很多观众,你要回答的是同一个问题,即在你15英尺以内有多少人。假设这两个足球场的人数密度是一样的,那你会有大致相同的人数需要数,所用的时间也会非常接近。于是可以说,不管足球场能容纳多少人,你将以预计的时间把你身边的人数完,因为你只需要数坐在你身边15英尺以内的人,而不用去关心在球场另一边包厢里的人。

Neo4j引擎正像本例一样工作——以预期的速度访问与起始节点相连的节点。即使整个图形的节点增加(假设节点密度一样),性能仍然可以保持预期的速度。

Neo4j学习笔记

1.7 Neo4j具有与ACID兼容的数据格式

Neo4j的目标是成为一个图形数据库,并把重点放在数据库上。这意味着你将在Neo4j数据库中得到ACID的全部支持:


·原子性(A)——你可以在一个事务中包含对多个数据库的操作,并确保它们都是在原子性的情况下执行的,如果其中有一个操作发生问题,则整个事务将全部回滚。


·一致性(C)——当向Neo4j数据库中写数据时,你必须保证随后访问数据库的每个用户读取的都是最近、更新的数据。

·隔离性(I)——必须确保一个单一事务中的操作与另外的事务中的操作是隔离的,因此,一个事务中的写操作不会影响另一个事务中的读操作。


·持久性(D)——必须确保写入到Neo4j数据库中的数据保存到磁盘,以便数据库重新启动或服务器崩溃后仍然可以获取写入的数据。



第2章 Neo4j的数据模型

不同于传统的关系数据库管理系统(Relational Database Management System,RDBMS),Neo4j是一个无架构数据库。在开始添加数据之前,你并不需要定义表和关系。一个节点可以具有你喜欢的任何属性,任何节点都可以与其他任何节点建立关系。


第3章 Neo4j开发入门

通过建模和建立一个Neo4j图形数据库的实例,介绍Neo4j核心Java API(Neo4j Core Java API)

在本章的第一部分,我们将模仿软件的设计过程,使用一系列图表为本例的需求建模。在第二部分,我们将演示如何使用Neo4j核心Java API创建同一个社交网络。