Neo4j开源NoSQL数据库

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 可以更高效地使用硬件,从而降低成本

部署

使用Neo4j Docker映像

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>

Neo4j Docker镜像的离线安装

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_AUTH设置初始密码

默认情况下,Neo4j要求进行身份验证,并提示您在第一次连接时使用用户名/密码neo4j/neo4j登录。然后会提示您设置新密码。
在Docker容器中使用Neo4j时,可以通过在run指令中指定NEO4J_AUTH来直接设置容器的初始密码:

扫描二维码关注公众号,回复: 14417123 查看本文章
--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()列出当前活动的配置设置及其值。

Set an initial password

使用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。在这种情况下首次登录时会提示您更改默认密码。

以非root用户身份运行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.

猜你喜欢

转载自blog.csdn.net/qq_50573146/article/details/126049424