Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。
它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中。但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注.
你可以把Neo看作是一个高性能的图引擎,该引擎具有成熟和健壮的数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Neo是一个网络——>面向网络的数据库<——也就是说,它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络上而不是表中。网络(从数学角度叫做图)是一个灵活的数据结构,可以应用更加敏捷和快速的开发模式。
现实中很多数据都是用图来表达的,比如社交网络中人与人的关系、地图数据、或是基因信息等等。RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘。NoSQL数据库的兴起,很好地解决了海量数据的存放问题,图数据库也是NoSQL的一个分支,相比于NoSQL中的其他分支,它很适合用来原生表达图结构的数据。
通常来说,一个图数据库存储的结构就如同数据结构中的图,由顶点和边组成。
Neo4j是图数据库中一个主要代表,其开源且用Java实现(需安装JDK)。经过几年的发展,已经可以用于生产环境。其有两种运行方式,一种是服务的方式,对外提供REST接口;另外一种是嵌入式模式,数据以文件的形式存放在本地,可以直接对本地文件进行操作。
Neo4j分三个版本:社区版(community)、高级版(advanced)和企业版(enterprise)。社区版是基础,本文主要对其作出介绍,它使用的是GPLv3协议,这意味着修改和使用其代码都需要开源,但是这是建立在软件分发的基础上,如果使用Neo4j作为服务提供,而不分发软件,则不需要开源。这实际上是GPL协议本身的缺陷。高级版和企业版建立在社区版的基础上,但多出一些高级特性。高级版包括一些高级监控特性,而企业版则包括在线备份、高可用集群以及高级监控特性。要注意它们使用了AGPLv3协议,也就是说,除非获得商业授权,否则无论以何种方式修改或者使用Neo4j,都需要开源。
▷ 一个本地化的图数据库:Neo4j 自底向上构建成一个图数据库。它的体系结构旨在优化快速管理、存储和遍历节点和关系。在 Neo4j 中,关系是数据库中最重要的元素,它代表节点之间的相互联系。众所周知,在关系数据库领域中,"关系"适用于多个不同表之间的连接操作,这种操作的性能下降与关系的数量呈指数级别的,但在 Neo4j 中则是用于从一个几点指向另一个节点,其性能却是线性级别的
▷ 界面友好:提供了查询与展示的 Web 操作界面。对于图数据模型使用 D3.js 做数据可视化,形象地展示了数据模型的节点和关系
▷ 声明式图查询语言:Cypher 是一种声明式图数据库查询语言,它表现力丰富,查询效率高,其地位和作用域关系型数据库中的 SQL 类似,Cypher 还有良好的扩展性,用户可以定制自己的查询方式(如自定义过程)
▷ ACID事务:Neo4j 通过 ACID 事务提供真正的数据安全, Neo4j 使用事务来保证输在硬件故障或系统奔溃的情况下不会丢失。
▷ 高性能:Neo4j 使用多副本主从复制的方式构建高可靠集群,支持大数据集合并且可以不断扩展其容量,可存储数百万亿个实体,提供了可容错、可扩展的集群,此外Neo4j还提供热备份和性能监控功能
▷ 代码开源: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 可以更高效地使用硬件,从而降低成本 |
docker run -itd\
--restart always \
--publish=7474:7474 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
neo4j:4.4.9
# 选项 描述 例子
--name 命名您的容器以避免通用id docker run --name myneo4j neo4j
-p 指定要公开的容器端口 docker run -p7687:7687 neo4j
-d 分离容器以在后台运行 docker run -d neo4j
-v 绑定装入卷 docker run -v $HOME/neo4j/data:/data neo4j
--env 将config设置为Neo4j数据库的环境变量 docker run --env NEO4J_AUTH=neo4j/test
--restart 控制Neo4j容器是在退出时自动启动,还是在Docker重启时自动启动 docker run --restart always
--help 输出完整的列表docker run选择 docker run --help
# 这--restart always选项将Neo4j容器(和Neo4j)设置为每当Docker守护程序重启时自动重启。
如果不想让容器在机器启动时自动启动,可以使用标志禁用此设置no:
docker update --restart=no <containerID>
Docker提供了docker save命令,用于将图像下载到一个.tar包中,以便可以脱机使用,或者传输到没有互联网接入的机器上。
docker save -o neo4j-4.4.9.tar neo4j:4.4.9
要从docker save创建的. tar文件中加载docker映像,请使用docker load命令。例如:
docker load --input neo4j-4.4.9.tar
默认情况下,Neo4j要求进行身份验证,并提示您在第一次连接时使用用户名/密码neo4j/neo4j
登录。然后会提示您设置新密码。
在Docker容器中使用Neo4j时,可以通过在run指令中指定NEO4J_AUTH来直接设置容器的初始密码:
--env NEO4J_AUTH=neo4j/your_password
或者,您可以通过将NEO4J_AUTH指定为none来禁用身份验证:
--env NEO4J_AUTH=none
请注意,目前没有办法改变neo4j的初始用户名。 如果装载了包含现有数据库的/data卷,设置NEO4J_AUTH将不起作用。Neo4j Docker服务将启动,但是要登录您需要一个已经与数据库关联的用户名和密码。
此images提供的默认配置旨在学习Neo4j,但必须进行修改以使其适合生产使用
。特别是Neo4j的默认内存分配非常有限(NEO4J_dbms_memory_pagecache_size=512M and NEO4J_dbms_memory_heap_max__size=512M
),以允许在同一台服务器上运行多个容器。
Setting | Description |
---|---|
dbms.memory.heap.initial_size | 设置JVM的初始堆大小。默认情况下JVM堆大小是根据可用的系统资源计算的。 |
dbms.memory.heap.max_size | 设置JVM堆的最大大小。默认情况下最大JVM堆大小是根据可用的系统资源计算的。 |
dbms.jvm.additional | 为JVM设置附加选项。这些选项被设置为一个字符串,可以根据JVM实现的不同而变化。 |
如果希望很好地控制系统行为,建议将堆大小参数设置为相同的值,以避免不必要的完全垃圾收集暂停。
可以使用以下命名方案将Neo4j配置设置传递给Docker容器:
▶ 以…为前缀NEO4J_
▶ 下划线转换为双下划线:_被写成__
▶ 句点转换为下划线:.被写成_
举个例子 dbms.tx_log.rotation.size 可以通过向Docker指定以下参数来设置 --env NEO4J_dbms_tx__log_rotation_size
可以采用多个选项的变量 (如dbms_jvm_additional) 必须 只定义一次,并且包含多个值的串联。例如:
--env NEO4J_dbms_jvm_additional="-Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=$HOME/conf/jmx.password -Dcom.sun.management.jmxremote.access.file=$HOME/conf/jmx.access -Dcom.sun.management.jmxremote.port=3637"
▶ 列出当前活动的设置
你可以使用程序dbms.listConfig()
列出当前活动的配置设置及其值。
使用neo4j-admin的set-initial-password命令为本地用户neo4j定义密码。这必须在首次启动数据库之前执行。
语法:
neo4j-admin set-initial-password <password> [--require-password-change]
例1:使用neo4j-admin的set-initial-password命令
首次启动数据库之前,将本机neo4j用户的密码设置为“h6u4%kr”。
$neo4j-home> bin/neo4j-admin set-initial-password h6u4%kr
例2:使用neo4j-admin的set-initial-password命令和可选的 --require-password-change 标志
首次启动数据库之前,将本机neo4j用户的密码设置为“secret”。首次登录时系统会提示您将此密码更改为您自己选择的一个密码。
$neo4j-home> bin/neo4j-admin set-initial-password secret --require-password-change
如果没有使用此方法显式设置密码,它将被设置为默认密码neo4j。在这种情况下首次登录时会提示您更改默认密码。
出于安全原因neo4j在容器内作为Neo4j用户运行。您可以通过使用 --user 参数调用docker来指定作为哪个用户运行。例如以下命令以您的当前用户身份运行Neo4j:
docker run \
--publish=7474:7474 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
--volume=$HOME/neo4j/logs:/logs \
--user="$(id -u):$(id -g)" \
--env NEO4J_dbms_memory_pagecache_size=4G \
neo4j:4.4.9
# --volume=$HOME/neo4j/conf:/conf(/conf卷中的任何配置文件都将覆盖映像提供的文件)
在启动Docker之前,您要挂载的文件夹必须存在,否则Neo4j将由于权限错误而无法启动。
它允许您通过浏览器http://ip:7474访问neo4j。
这为HTTP和Bolt访问Neo4j API绑定了两个端口(7474和7687)。一个卷被绑定到/data,以允许数据库在容器之外持久化。
默认情况下,这要求您使用neo4j/neo4j登录并更改密码。出于开发目的,您可以通过将- env=NEO4J_AUTH=none
传递给docker run来禁用身份验证。
Hard work can only make you pass, hard work can make you better.