如何在 Ubuntu 22.04 上安装和配置 Neo4j

介绍

Neo4j是一个图形数据库,记录数据节点之间的关系,而传统的关系数据库使用行和列来存储和结构数据。

前提条件

要遵循本教程,您将需要以下内容:

步骤 1 – 安装 Neo4j

官方的Ubuntu包存储库不包含Neo4j数据库引擎的副本. 要安装来自Neo4j的上游支持的包,您需要添加Neo4j的GPG密钥,以确保包的下载是有效的。

要开始,请下载并将下列curl命令的输出输入到gpg --dearmor命令中,此步骤将将下载的密钥转换为一个格式,而apt可以用来验证包:

1curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key |sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg

接下来,将 Neo4j 4.1 存储库添加到您的系统的 APT 源:

1echo "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:

1sudo apt update
1sudo apt install neo4j

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

1sudo systemctl enable neo4j.service

现在开始服务,如果它还没有运行:

1sudo systemctl start neo4j.service

完成所有这些步骤后,使用systemctl命令检查Neo4j的状态:

1sudo systemctl status neo4j.service

你应该有类似于以下的输出:

1[secondary_label Output]
2 neo4j.service - Neo4j Graph Database
3     Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled)
4     Active: active (running) since Fri 2022-04-29 15:01:36 UTC; 2s ago
5   Main PID: 2053 (java)
6      Tasks: 40 (limit: 38383)
7     Memory: 658.1M
8     CGroup: /system.slice/neo4j.service
9. . .

将有其他可言的输出线,但重要的是要注意的是突出的启用运行线条.一旦安装和运行Neo4j,您可以转到下一组步骤,这将指导您通过连接到Neo4j,配置凭据,并插入节点到数据库中。

步骤 2 — 连接和配置 Neo4j

现在,您已经安装了 Neo4j 并配置为在任何重新启动后运行,您可以测试连接到数据库并配置管理员凭证。

要在命令行上与 Neo4j 进行交互,请使用cipher-shell实用程序:

1cypher-shell

当您首次调用壳时,您将使用默认的管理用户neo4jneo4j密码组合登录。

1[secondary_label cypher-shell prompt]
2username: neo4j
3password: *****
4Password change required
5new password: ********************
6Connected to Neo4j 4.1.0 at neo4j://localhost:7687 as user neo4j.
7Type :help for a list of available commands or :exit to exit the shell.
8Note that Cypher queries must end with a semicolon.
9neo4j@neo4j>

在本示例中,突出的***** ****** ****** ***是新密码的伪装版本。选择自己的强大而可记忆的密码,并确保在安全的地方记录它。一旦设置密码,您将连接到交互式neo4j@neo4j>提示,您可以通过插入和查询节点与Neo4j数据库进行交互。

<$>[注意] 注意 :Neo4j的社区版支持一次运行单个数据库。此外,社区版本不包括将角色和权限分配给用户的功能,因此这些步骤不包括在本教程中。

现在你已经设置了一个管理员密码,并测试了连接到Neo4j,请通过键入:exit来退出cypher-shell提示:

1:exit

接下来,您可以选择配置Neo4j以接受远程连接。

步骤 3 (可选) — 配置 Neo4j 用于远程访问

如果您想将 Neo4j 集成到使用多个服务器的大型应用程序或环境中,则需要将其配置为接受来自其他系统的连接。

默认情况下,Neo4j配置为仅接受来自本地主机的连接(‘127.0.0.1’是本地主机的IP地址)。

要将 Neo4j 所使用的网络接口从localhost更改为其他系统可以使用的网络接口,您需要编辑 /etc/neo4j/neo4j.conf’ 文件。 在您偏好的编辑器中打开配置文件,然后找到 dbms.default_listen_address设置。下面的示例使用nano' 来编辑该文件:

1sudo nano /etc/neo4j/neo4j.conf

查找评论的#dbms.default_listen_address=0.0.0.0行,并通过删除领先的#评论字符删除评论。

 1[label /etc/neo4j/neo4j.conf]
 2. . .
 3#*****************************************************************
 4# Network connector configuration
 5#*****************************************************************
 6
 7# With default configuration Neo4j only accepts local connections.
 8# To accept non-local connections, uncomment this line:
 9dbms.default_listen_address=0.0.0.0
10. . .

默认情况下,值 0.0.0.0 将 Neo4j 绑定到系统上的所有可用的 IPv4 接口,包括 localhost. 如果您想将 Neo4j 限制在一个特定的 IP 地址上,例如服务器使用的私人网络 IP,请在这里指定为服务器的私人网络接口分配的 IP 地址。

您还可以配置 Neo4j 以使用 IPv6 接口. 与 IPv4 一样,您可以将 default_listen_address 值设置为您将使用的特定 IPv6 地址来与 Neo4j 通信。

当您完成配置 Neo4j 将用于连接的默认 IP 地址时,请保存并关闭neo4j.conf

<$>[注意] 注意 :如果您配置 Neo4j 以 IPv6 地址,您将无法直接使用 IPv6 地址连接到 Neo4j 以数字壳。相反,您将需要配置一个 DNS 名称以解决 IPv6 地址,或者在远程系统的 `/etc/hosts 文件中添加一个条目,将地址绘制为一个名称。

例如,一个具有 IPv6 地址的 Neo4j 服务器,如 2001:db8::1 将要求远程连接系统具有如下类似的 /etc/hosts' 条目,取代一个名称,而不是突出的 your_hostname`:

1[label /etc/hosts]
2. . .
32001:db8::1 your_hostname

然后,您将使用您指定的名称从远程系统连接到服务器:

1cypher-shell -a 'neo4j://your_hostname:7687'

如果您限制 Neo4j 使用 IPv6 本地主机 地址 ::1,那么您可以在 Neo4j 服务器上使用从您的 /etc/hosts’ 文件中预配置的 ip6-localhost 名称本地连接到它,如下:

1cypher-shell -a 'neo4j://ip6-localhost:7687'

一旦您用连接URI调用cypher-shell,您将像往常一样被要求提供您的用户名和密码。

现在你已经配置了Neo4j以允许远程连接,重要的是限制远程访问,以便只有可信赖的系统可以连接到它。 为了限制远程访问Neo4j,你可以使用Ubuntu的默认UFW防火墙。

Neo4j在默认安装中创建了两个网络接口,一个是用于内置的 HTTP 接口的 7474 端口,另一个是用于 7687 端口的主要 bolt 协议

若要配置防火墙以允许可信的远程主机使用 IPv4 访问``接口,请输入以下命令:

1[label UFW IPv4 Single Host Example]
2sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp

取代您将使用来访问 Neo4j 的受信任远程系统的 IP 地址,而不是突出的 203.0.113.1 值。

如果要允许整个网络范围的访问,例如私人管理或数据路径网络,请使用这样的规则:

1[label UFW IPv4 Network Example]
2sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp

再次,取代您想要访问 Neo4j 的网络,而不是突出的 192.0.2.0/24 网络。

如果您想允许主机使用 IPv6 远程访问 Neo4j,请添加如下这样的规则:

1[label UFW IPv6 Single Host Example]
2sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp

更换您的受信任系统的 IPv6 地址,而不是突出的 2001:DB8::1/128 地址。

与IPv4一样,您还可以允许一系列IPv6地址访问您的Neo4j服务器。

1[label UFW IPv6 Single Host Example]
2sudo ufw allow from 2001:DB8::/32 to any port 7687 proto tcp

再次更换您信任的网络范围,而不是突出的2001:DB8::/32网络范围。

一旦您为您的网络配置和受信任的主机或网络创建了适当的 UFW 规则或规则,请允许 UFW 使规则生效:

1sudo ufw reload

您可以使用ufw status命令检查当前加载的 UFW 规则,运行它以确保您指定的地址或网络可以在端口 7687 上访问 Neo4j:

1sudo ufw status

你应该有类似于以下的输出:

1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
622/tcp ALLOW Anywhere
722/tcp (v6)                ALLOW Anywhere (v6)
87687/tcp ALLOW 203.0.113.1

您现在有一个 Neo4j 服务器,该服务器已配置为允许在端口 7687 上访问可靠的远程服务器或网络,在本教程的下一节中,您将了解如何将节点添加到数据库中,以及如何定义它们之间的关系。

步骤 4 — 使用 Neo4j

要开始使用 Neo4j,让我们添加一些示例节点,然后定义它们之间的关系。

1cypher-shell

<$>[注] :如果您在 [步骤 3 (可选) — 配置 Neo4j for Remote Access](步骤 3 可选配置-neo4j-for-remote-access)中配置了 Neo4j 以允许远程访问,则使用与您的 Neo4j 服务器地址相符的 URI 连接。

1cypher-shell -a 'neo4j://203.0.113.1:7687'

您将像往常一样被要求提供您的用户名和密码。

如果您正在使用 IPv6,请确保您有一个/etc/hosts的名称,如步骤 3 所述,然后从远程系统连接到您的 Neo4j 服务器,使用一个cypher-shell命令,如下:

1cypher-shell -a 'neo4j://your_hostname:7687'

再次,确保突出的您的_主机名称地图到您的远程系统的/etc/hosts文件中的 Neo4j 服务器的 IPv6 地址。

一旦使用您的用户名和密码登录 Neo4j,您可以查询并将节点和关系添加到数据库中。

要开始,请将一个大白鲨节点添加到 Neo4j. 下面的命令将创建一个类型的节点Shark,名为大白

1CREATE (:Shark {name: 'Great White'});

每个命令后,您将收到类似于以下的输出:

1[secondary_label Output]
20 rows available after 3 ms, consumed after another 0 ms
3Added 1 nodes, Set 1 properties, Added 1 labels

<$>[注] :以下每个数字查询的完整解释超出了本教程的范围。有关数字查询语言的语法的详细信息,请参阅 The Neo4j Cypher Manual 。 <$>

接下来,添加一些更多的鲨鱼,并使用名为FRIEND的关系来关系它们。Neo4j允许您将节点与任意命名的关系联系起来,因此FRIEND可以是您想要使用的关系的任何标签。

在下面的示例中,您将添加三个鲨鱼,并使用名为FRIEND的关系将它们连接在一起:

1CREATE
2(:Shark {name: 'Hammerhead'})-[:FRIEND]->
3(:Shark {name: 'Sammy'})-[:FRIEND]->
4(:Shark {name: 'Megalodon'});

您应该收到输出,表示三个新鲨鱼被添加到数据库:

1[secondary_label Output]
2. . .
3Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels

Neo4j 允许您使用任意的关系名称来关联节点,因此除了它们现有的FRIEND关系外,Sammy 和 Megalodon 还可以使用分类等级进行关联。

Sammy 和 Megalodon 共享一个共同的 Lamniformes 顺序. 由于关系可以像节点一样具有属性,创建一个命令关系,用一个设置为Lamniformes名称属性来帮助描述 Sammy 和 Megalodon 的关系之一:

1MATCH (a:Shark),(b:Shark)
2WHERE a.name = 'Sammy' AND b.name = 'Megalodon'
3CREATE (a)-[r:ORDER { name: 'Lamniformes' }]->(b)
4RETURN type(r), r.name;

添加该关系后,您应该有如下类似的输出:

1[secondary_label Output]
2+-------------------------+
3| type(r) | r.name        |
4+-------------------------+
5| "ORDER" | "Lamniformes" |
6+-------------------------+
7
81 row available after 2 ms, consumed after another 7 ms
9Created 1 relationships, Set 1 properties

接下来,添加Sammy和Hammerhead之间的SUPERORDER关系,基于他们的分类超级顺序,即Selachimorpha。

1MATCH (a:Shark),(b:Shark)
2WHERE a.name = 'Sammy' AND b.name = 'Hammerhead'
3CREATE (a)-[r:SUPERORDER { name: 'Selachimorpha'}]->(b)
4RETURN type(r), r.name;

再次,您将收到指示关系类型的输出,以及用于描述关系添加的名称:

1[secondary_label Output]
2+--------------------------------+
3| type(r)      | r.name          |
4+--------------------------------+
5| "SUPERORDER" | "Selachimorpha" |
6+--------------------------------+
7
81 row available after 2 ms, consumed after another 8 ms
9Created 1 relationships, Set 1 properties

最后,随着所有这些节点和关系在 Neo4j 中定义和存储,使用以下查询来检查数据:

1MATCH (a)-[r]->(b)
2RETURN a.name,r,b.name
3ORDER BY r;

您应该获得如下类型的输出:

 1[secondary_label Output]
 2+---------------------------------------------------------------------+
 3| a.name       | r                                     | b.name       |
 4+---------------------------------------------------------------------+
 5| "Hammerhead" | [:FRIEND]                             | "Sammy"      |
 6| "Sammy"      | [:FRIEND]                             | "Megalodon"  |
 7| "Sammy"      | [:ORDER {name: "Lamniformes"}]        | "Megalodon"  |
 8| "Sammy"      | [:SUPERORDER {name: "Selachimorpha"}] | "Hammerhead" |
 9+---------------------------------------------------------------------+
10
114 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 文档

Published At
Categories with 技术
comments powered by Disqus