如何在Ubuntu22.04上安装和配置Neo4j

来自菜鸟教程
跳转至:导航、​搜索

介绍

Neo4j 是一个记录数据节点之间关系的图形数据库,而传统的关系数据库使用行和列来存储和结构化数据。 由于每个节点都存储对它所连接的所有其他节点的引用,Neo4j 可以以最小的开销编码和查询复杂的关系。

先决条件

要学习本教程,您将需要以下内容:

第 1 步 — 安装 Neo4j

官方 Ubuntu 软件包存储库不包含 Neo4j 数据库引擎的副本。 要从 Neo4j 安装上游支持的软件包,您需要从 Neo4j 添加 GPG 密钥以确保软件包下载有效。 然后,您将添加一个指向 Neo4j 软件存储库的新包源,最后安装该包。

首先,下载以下 curl 命令的输出并将其通过管道传输到 gpg --dearmor 命令。 此步骤会将下载的密钥转换为 apt 可用于验证包的格式:

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

文件的 [signed-by=/usr/share/keyrings/neo4j.gpg] 部分指示 apt 使用您下载的密钥来验证 neo4j 包的存储库和文件信息。

下一步是更新您的包列表,然后安装 Neo4j 包及其所有依赖项。 这一步会下载并安装一个兼容的Java包,所以当apt命令提示你安装所有依赖时,你可以输入Y

sudo apt update
sudo apt install neo4j

安装过程完成后,Neo4j 应该会运行。 但是,它没有设置为在系统重新启动时启动。 所以最后一个设置步骤是将其作为服务启用,然后启动它:

sudo systemctl enable neo4j.service

现在启动该服务(如果它尚未运行):

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 2022-04-29 15:01:36 UTC; 2s ago
   Main PID: 2053 (java)
      Tasks: 40 (limit: 38383)
     Memory: 658.1M
     CGroup: /system.slice/neo4j.service
. . .

还会有其他详细的输出行,但要注意的重要事项是突出显示的 enabledrunning 行。 安装并运行 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.1localhost 的 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 22.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 的共同顺序。 由于关系可以像节点一样具有属性,因此使用设置为 Lamniformesname 属性创建一个 ORDER 关系,以帮助描述 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 关系,以及 ORDERSUPERORDER 分类关系。

完成向 Neo4j 数据库添加和探索节点和关系后,键入 :exit 命令以离开 cypher-shell

结论

您现在已经在您的服务器上安装、配置和添加了数据到 Neo4j。 您还可以选择将 Neo4j 配置为接受来自远程系统的连接并使用 UFW 对其进行保护。

如果您想了解更多关于使用 Neo4j 和 cypher 查询语言的信息,请查阅官方 Neo4j 文档