1.5 Neo4j 简介
Neo4j 是由 Java 实现的开源 NoSQL图数据库。自 2003 年开始研发,直到 2007 年正式发布第一版。 Neo4j 的源代码托管在 GitHub 上,技术支持托管在 Stack Overflow 和 Neo4j Google 讨论组上。 Neo4j 现如今已经被各种行业的数十万家公司和组织采用。 Neo4j 的使用案例涵盖了网络管理、软件分析、科学研究、路由分析、组织和项目管理、决策制定、社交网络等诸多方面。
Neo4j 实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存级数据库不同, Neo4j 提供了完整的数据库特性,包括 ACID 事务的支持、集群支持、备份与故障转移等,这使其适合于企业级生产环境下的各种应用。
另外, Neo4j 一些特殊功能使得 Neo4j 在用户、开发人员和 DBA 中非常受欢迎。
- 一个本地化的图数据库: Neo4j 自底向上构建成一个图数据库。它的体系结构旨在优化快速管理、存储和遍历节点和关系。在 Neo4j 中,关系是数据库中最重要的元素,它代表节点之间的相互联系。众所周知,在关系数据库领域中,“关系” 用于多个不同表之间的连接操作,这种操作的性能下降与关系的数量呈指数级别的,但在 Neo4j 中则是用于从一个节点指向另一个节点,其性能却是线性级别的。
- 界面友好:Neo4j 提供了一个查询与展示一体化的 Web 操作界面。对于图数据模型 Neo4j 使用 D3.js 做数据可视化,非常形象地展示了数据模型的节点和关系。
- 声明式图查询语言: Cypher 是一种声明式图数据库查询语言,它表现力丰富,查询效率高,其地位和作用与关系型数据库中的 SQL 语言(Structured Query Language,结构化查询语言)类似。 Cypher 还有良好的扩展性,用户可以定制自己的查询方式(如自定义过程)。
- ACID 事务: Neo4j 通过 ACID 事务提供真正的数据安全, Neo4j 使用事务来保证数据在硬件故障或系统崩溃的情况下不会丢失。
- 高性能: Neo4j 使用多副本主从复制的方式构建高可靠性集群,支持大数据集合并且可以不断扩展其容量,可存储数百万亿个实体。也就是说, Neo4j 可部署在-一个可容错、可扩展的集群上。此外 Neo4j 还提供热备份和性能监控功能。
- 代码开源: Neo4j 将源代码公布到 GitHub ,任何人都可以去 Neo4j 的 GitHub 主页下载源代码。
当然,传统的关系数据库经过长期的发展,其特性、性能已经被企业级应用认可,并且新兴的其他 NoSQL 数据库也越来越多地被使用在企业级项目的数据存储解决方案中;那么 Neo4j 这种图数据库与关系数据库、 NoSQL 数据库对比,其优势是什么呢? Neo4j 与其他数据库的对比情况如下表所示。
性能 | 关系数据库 | 其他 NoSQL 数据库 | Neo4j |
---|---|---|---|
数据存储 | 关系数据库的数据存储在一个预定义好的、结构固定的二维表格中,数据之间的关系靠各个表格行列之间相互关联实现,查询效率低下 | 其他 NoSQL 不支持数据库级别的数据连接操作。性能和数据可信度随着连接的规模和复杂程度的增加而降低 | Neo4j 采用具有自由邻接特性的图存储结构,能够提供更快的事务处理和数据关系处理功能 |
数据模型 | 关系数据库模型必须与建模者-起开发,并从逻辑模型转换为物理模型。由于数据类型和来源必须提前知道,所以后续的任何更改都会导致很大的结构变动,这对项目是很不利的 | 其他 NoSQL 数据模型不适合企业架构将其用来作为广泛的列和文档存储,不能在设计层面提供控制 | Neo4j 提供灵活的数据模型,逻辑模型和物理模型之间不会相互耦合。可以随时、随意添加或更改数据和数据类型,从而大大缩短开发时间,实现项目真正的敏捷、迭代开发 |
数据查询性能 | 在关系数据库的多表联合查询中,数据处理性能严重受限于连接操作,如果单个表的行数过大,即便是很简单的连接查询也会耗费大量性能资源 | 其他 NoSQL 支持复杂数据关系的处理能力较弱,因此必须在应用程序级处理所有的数据关系 | Neo4j 使用图存储结构,数据之间的关系附加在节点上,无论关系的数量或深度如何都能确保零延迟和实时性能 |
查询语言 | SQL 查询语言,其复杂性会随连接数据查询所需的 JOIN 操作的数量而增加 | 各种 NoSQL 数据库的查询语言有所不同,但都没用于表达数据关系的机制 | Cypher 是一种图查询语言,提供了描述关系查询的最有效的表达方式 |
事务处理 | 企业应用程序需要使用关系数据库的 ACID 事务支持,以确保数据的一致性和可靠性 | 其他 NoSQL 基本无法提供 ACID 事务,因为其数据关系的基本可用性和最终一致性是不可靠的 | Neo4j 可以为企业应用程序提供 ACID 事务来保持全面一致和可靠的数据 |
数据库的扩展性 | 关系数据库通过主从服务器间的复制进行扩展,成本很高。如果数据表之间有多种复杂关系,这种扩展会降低集群的整体性能 | 其他 NoSQL 的扩展可以提升数据的写入性能但不能提升数据的读取性能,不能保证数据的可靠性 | Neo4j 本质上适用于基于模式的查询。其扩展架构通过主从服务器间的复制来维护数据完整性。支持 IBM POWER8 和 CAPIFlash 系统进行大规模扩展 |
创建大规模数据中心 | 关系数据库可以通过服务器整合来创建大规模数据中心,但是其扩展架构是很昂贵的 | 使用 NoSQL 可以不断向其扩展架构中添加新硬件,但其不考虑能源成本、网络漏洞和其他风险 | Neo4j 可以更高效地使用硬件,从而降低成本 |