如何在Ubuntu20.04上安装和配置Neo4j
介绍
Neo4j 是一个记录数据节点之间关系的图形数据库,而传统的关系数据库使用行和列来存储和结构化数据。 由于每个节点都存储对它所连接的所有其他节点的引用,Neo4j 可以以最小的开销编码和查询复杂的关系。
先决条件
要学习本教程,您将需要以下内容:
- 按照 Ubuntu 20.04 初始服务器设置指南 设置一台 Ubuntu 20.04 服务器,包括启用 sudo 的非 root 用户和防火墙。
第 1 步 — 安装 Neo4j
官方 Ubuntu 软件包存储库不包含 Neo4j 数据库引擎的副本。 To install the upstream supported package from Neo4j you’ll need to add the GPG key from Neo4j to ensure package downloads are valid. Then you’ll add a new package source pointing to the Neo4j software repository, and finally install the package.
To get started, download and pipe the output of the following curl command to the gpg --dearmor
command. This step will convert the key into a format that apt can use to verify downloaded packages:
curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key |sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg
接下来,将 Neo4j 4.1 存储库添加到系统的 APT 源中:
echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable 4.1" | sudo tee -a /etc/apt/sources.list.d/neo4j.list
The [signed-by=/usr/share/keyrings/neo4j.gpg]
portion of the file instructs apt
to use the key that you downloaded to verify repository and file information for neo4j packages.
The next step is to update your package lists, and then install the Neo4j package and all of its dependencies. 这一步会下载并安装一个兼容的Java包,所以当apt
命令提示你安装所有依赖时,你可以输入Y
:
sudo apt update
sudo apt install neo4j
安装过程完成后,Neo4j 应该会运行。 但是,它没有设置为在系统重新启动时启动。 So the last setup step is to enable it as a service and then start it:
sudo systemctl enable neo4j.service
Now start the service if it is not already running:
sudo systemctl start neo4j.service
完成所有这些步骤后,使用 systemctl
命令检查 Neo4j 的状态:
sudo systemctl status neo4j.service
您应该具有类似于以下内容的输出:
Output● neo4j.service - Neo4j Graph Database Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-08-07 01:43:00 UTC; 6min ago Main PID: 21915 (java) Tasks: 45 (limit: 1137) Memory: 259.3M CGroup: /system.slice/neo4j.service . . .
还会有其他详细的输出行,但要注意的重要事项是突出显示的 enabled
和 running
行。 安装并运行 Neo4j 后,您可以继续执行下一组步骤,这将指导您连接到 Neo4j、配置凭据以及将节点插入数据库。
第 2 步 — 连接和配置 Neo4j
现在您已安装 Neo4j 并将其配置为在任何重新启动后运行,您可以测试连接到数据库并配置管理员凭据。
要在命令行上与 Neo4j 交互,请使用 cypher-shell
实用程序。 像这样调用实用程序:
cypher-shell
当您第一次调用 shell 时,您将使用默认的管理 neo4j
用户和 neo4j
密码组合登录。 一旦您通过身份验证,Neo4j 将提示您更改管理员密码:
cypher-shell promptusername: neo4j password: ***** Password change required new password: ******************** Connected to Neo4j 4.1.0 at neo4j://localhost:7687 as user neo4j. Type :help for a list of available commands or :exit to exit the shell. Note that Cypher queries must end with a semicolon. neo4j@neo4j>
在此示例中,突出显示的 ********************
是新密码的屏蔽版本。 选择您自己的强大且令人难忘的密码,并确保将其记录在安全的地方。 设置密码后,您将连接到交互式 neo4j@neo4j>
提示,您可以在其中通过插入和查询节点与 Neo4j 数据库进行交互。
注意:Neo4j 社区版支持一次运行一个数据库。 此外,社区版本不包括为用户分配角色和权限的功能,因此本教程不包括这些步骤。 有关 Neo4j 社区版支持的各种功能的更多信息,请参阅此处的 Neo4j 文档 。
现在您已经设置了管理员密码并测试了连接到 Neo4j,通过键入 :exit
退出 cypher-shell
提示:
:exit
接下来,您可以选择配置 Neo4j 以接受远程连接。
第 3 步(可选)- 为远程访问配置 Neo4j
如果您想将 Neo4j 整合到使用多个服务器的大型应用程序或环境中,则需要将其配置为接受来自其他系统的连接。 在此步骤中,您将配置 Neo4j 以允许远程连接,您还将添加防火墙规则以限制哪些系统可以连接到您的 Neo4j 服务器。
默认情况下,Neo4j 配置为仅接受来自 localhost
的连接(127.0.0.1
是 localhost
的 IP 地址)。 此配置可确保您的 Neo4j 服务器不会暴露在公共 Internet 中,并且只有有权访问本地系统的用户才能与 Neo4j 交互。
要将 Neo4j 使用的网络套接字从 localhost
更改为其他系统可以使用的网络套接字,您需要编辑 /etc/neo4j/neo4j.conf
文件。 在您喜欢的编辑器中打开配置文件并找到 dbms.default_listen_address
设置。 以下示例使用 nano
编辑文件:
sudo nano /etc/neo4j/neo4j.conf
找到注释掉的 #dbms.default_listen_address=0.0.0.0
行并通过删除前导 #
注释字符取消注释它。
/etc/neo4j/neo4j.conf
. . . #***************************************************************** # Network connector configuration #***************************************************************** # With default configuration Neo4j only accepts local connections. # To accept non-local connections, uncomment this line: dbms.default_listen_address=0.0.0.0 . . .
默认情况下,值 0.0.0.0
会将 Neo4j 绑定到系统上所有可用的 IPv4 接口,包括 localhost
。 如果您想将 Neo4j 限制为特定的 IP 地址,例如您的服务器用于数据路径的专用网络 IP,请在此处指定分配给服务器专用网络接口的 IP 地址。
您还可以将 Neo4j 配置为使用 IPv6 接口。 与 IPv4 一样,您可以将 default_listen_address
值设置为将用于与 Neo4j 通信的特定 IPv6 地址。 如果你想限制 Neo4j 只为你的服务器使用本地 IPv6 地址,请指定 ::1
,它对应于使用 IPv6 表示法的 localhost
。
完成配置 Neo4j 将用于连接的默认 IP 地址后,保存并关闭 neo4j.conf
。 如果您使用 nano
,您可以按 CTRL+X
,然后按 Y
,然后按 ENTER
。
注意:如果你用 IPv6 地址配置 Neo4j,你将无法直接使用 IPv6 地址连接到带有 cypher-shell
的 Neo4j。 相反,您需要配置解析为 IPv6 地址的 DNS 名称,或者在远程系统的 /etc/hosts
文件中添加一个条目,将地址映射到名称。 然后,您将能够使用 DNS 或主机文件名从远程系统使用 IPv6 连接到 Neo4j。
例如,具有 IPv6 地址(如 2001:db8::1
)的 Neo4j 服务器将要求远程连接系统具有如下所示的 /etc/hosts
条目,用名称代替突出显示的 [X206X ]:
/etc/hosts
. . . 2001:db8::1 your_hostname
然后,您将使用您指定的名称从远程系统连接到服务器,如下所示:
cypher-shell -a 'neo4j://your_hostname:7687'
如果您限制 Neo4j 使用 ::1
的 IPv6 localhost
地址,那么您可以使用 /etc/hosts
文件如下:
cypher-shell -a 'neo4j://ip6-localhost:7687'
使用连接 URI 调用 cypher-shell
后,系统将照常提示您输入用户名和密码。
现在您已经将 Neo4j 配置为允许远程连接,限制远程访问非常重要,这样只有受信任的系统才能连接到它。 要限制对 Neo4j 的远程访问,您可以使用 Ubuntu 的默认 UFW 防火墙。 如果您遵循先决条件 Initial Server Setup with Ubuntu 20.04 tutorial 那么 UFW 已经安装并准备好在您的服务器上使用。
Neo4j 在默认安装中创建了两个网络套接字,一个在端口 7474 上用于内置 HTTP 接口,主 bolt 协议 在端口 7687 上。 Neo4j 建议 不要在生产中使用 HTTP 端口,因此我们将仅为端口 7687 创建防火墙规则。
要将防火墙配置为允许受信任的远程主机使用 IPv4 访问 bolt
接口,请键入以下命令:
UFW IPv4 单主机示例
sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp
用您将用于访问 Neo4j 的受信任远程系统的 IP 地址替换突出显示的 203.0.113.1 值。
如果您想允许整个网络范围访问,例如私有管理或数据路径网络,请使用如下规则:
UFW IPv4 网络示例
sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
同样,将您希望访问 Neo4j 的网络替换为突出显示的 192.0.2.0/24 网络。
如果您想允许主机使用 IPv6 远程访问 Neo4j,请添加如下规则:
UFW IPv6 单主机示例
sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp
用您信任的系统的 IPv6 地址代替突出显示的 2001:DB8::1/128
地址。
与 IPv4 一样,您还可以允许一系列 IPv6 地址访问您的 Neo4j 服务器。 为此,请创建一个 UFW 规则,如下所示:
UFW IPv6 单主机示例
sudo ufw allow from 2001:DB8::/32 to any port 7687 proto tcp
再次用您信任的网络范围替换突出显示的 2001:DB8::/32
网络范围。
为网络配置和受信任的主机或网络创建适当的 UFW 规则或规则后,启用 UFW 以使规则生效:
sudo ufw reload
您可以使用 ufw status
命令检查当前加载的 UFW 规则。 运行它以确保您指定的地址或网络可以访问端口 7687 上的 Neo4j:
sudo ufw status
您应该具有类似于以下内容的输出:
OutputStatus: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) 7687/tcp ALLOW 203.0.113.1
您现在有一个配置为允许在端口 7687 上访问受信任的远程服务器或网络的 Neo4j 服务器。 在本教程的下一部分中,您将了解如何将节点添加到数据库,以及如何定义它们之间的关系。
第 4 步 — 使用 Neo4j
要开始使用 Neo4j,让我们添加一些示例节点,然后定义它们之间的关系。 使用 cypher-shell
连接到 Neo4j。
cypher-shell
注意:如果您在[步骤3(可选)-配置Neo4j进行远程访问](step-3-optional-configuring-neo4j-for-remote-access]中将Neo4j配置为允许远程访问,请使用连接对应于 Neo4j 服务器地址的 URI。 例如,如果您的 Neo4j 服务器的 IP 是 203.0.113.1
,那么从您的远程系统像这样连接到它:
cypher-shell -a 'neo4j://203.0.113.1:7687'
系统会像往常一样提示您输入用户名和密码。
如果您使用的是 IPv6,请确保您有一个 /etc/hosts
条目,其名称如步骤 3 中所述。 然后使用 cypher-shell
命令从远程系统连接到 Neo4j 服务器,如下所示:
cypher-shell -a 'neo4j://your_hostname:7687'
同样,确保突出显示的 your_hostname
映射到远程系统的 /etc/hosts
文件中的 Neo4j 服务器的 IPv6 地址。
一旦您使用您的用户名和密码登录到 Neo4j,您就可以查询并将节点和关系添加到数据库中。
首先,将大白鲨节点添加到 Neo4j。 以下命令将创建一个类型为 Shark
的节点,其名称为 Great White
。
CREATE (:Shark {name: 'Great White'});
在每个命令之后,您将收到类似于以下内容的输出:
Output0 rows available after 3 ms, consumed after another 0 ms Added 1 nodes, Set 1 properties, Added 1 labels
注意:以下每个 cypher
查询的完整说明超出了本教程的范围。 有关 cypher
查询语言的语法的详细信息,请参阅 The Neo4j Cypher 手册 。
接下来,添加更多鲨鱼,并使用称为 FRIEND
的关系将它们关联起来。 Neo4j 允许您将节点与任意命名的关系相关联,因此 FRIEND
可以是您想要使用的关系的任何标签。
在以下示例中,我们将添加三个鲨鱼,并使用称为 FRIEND
的关系将它们链接在一起:
CREATE (:Shark {name: 'Hammerhead'})-[:FRIEND]-> (:Shark {name: 'Sammy'})-[:FRIEND]-> (:Shark {name: 'Megalodon'});
您应该会收到表明三条新鲨鱼已添加到数据库的输出:
Output. . . Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels
Neo4j 允许您使用任意名称来关联节点,因此除了现有的 FRIEND
关系之外,Sammy 和 Megalodon 还可以使用分类等级进行关联。
Sammy 和 Megalodon 共享 Lamniformes 的共同顺序。 由于关系可以像节点一样具有属性,因此我们将创建一个 ORDER
关系,并将 name
属性设置为 Lamniformes
以帮助描述 Sammy 和 Megalodon 的关系之一:
MATCH (a:Shark),(b:Shark) WHERE a.name = 'Sammy' AND b.name = 'Megalodon' CREATE (a)-[r:ORDER { name: 'Lamniformes' }]->(b) RETURN type(r), r.name;
添加该关系后,您应该具有如下输出:
Output+-------------------------+ | type(r) | r.name | +-------------------------+ | "ORDER" | "Lamniformes" | +-------------------------+ 1 row available after 2 ms, consumed after another 7 ms Created 1 relationships, Set 1 properties
接下来,根据 Sammy 和 Hammerhead 的分类超目,即 Selachimorpha,在它们之间添加 SUPERORDER
关系。 同样,该关系被赋予 name
属性,该属性设置为 Selachimorpha
:
MATCH (a:Shark),(b:Shark) WHERE a.name = 'Sammy' AND b.name = 'Hammerhead' CREATE (a)-[r:SUPERORDER { name: 'Selachimorpha'}]->(b) RETURN type(r), r.name;
您将再次收到指示关系类型的输出,以及为描述关系而添加的名称:
Output+--------------------------------+ | type(r) | r.name | +--------------------------------+ | "SUPERORDER" | "Selachimorpha" | +--------------------------------+ 1 row available after 2 ms, consumed after another 8 ms Created 1 relationships, Set 1 properties
最后,在 Neo4j 中定义和存储所有这些节点和关系后,使用以下查询检查数据:
MATCH (a)-[r]->(b) RETURN a.name,r,b.name ORDER BY r;
您应该收到如下输出:
Output+---------------------------------------------------------------------+ | a.name | r | b.name | +---------------------------------------------------------------------+ | "Hammerhead" | [:FRIEND] | "Sammy" | | "Sammy" | [:FRIEND] | "Megalodon" | | "Sammy" | [:ORDER {name: "Lamniformes"}] | "Megalodon" | | "Sammy" | [:SUPERORDER {name: "Selachimorpha"}] | "Hammerhead" | +---------------------------------------------------------------------+ 4 rows available after 72 ms, consumed after another 1 ms
输出包括在 Hammerhead、Sammy 和 Megalodon 之间定义的 FRIEND
关系,以及 ORDER
和 SUPERORDER
分类关系。
完成向 Neo4j 数据库添加和探索节点和关系后,键入 :exit
命令以离开 cypher-shell
。
结论
您现在已经在您的服务器上安装、配置和添加了数据到 Neo4j。 您还可以选择将 Neo4j 配置为接受来自远程系统的连接并使用 UFW 对其进行保护。
如果您想了解更多关于使用 Neo4j 和 cypher
查询语言的信息,请查阅官方 Neo4j 文档。