如何在 Ubuntu 22.04 上安装和配置 Neo4j 图形数据库
在此页
- 先决条件
- 第 1 步 - 安装 Neo4j
- 第 2 步 - 测试连接
- 第 3 步 - 配置 Neo4j 以进行远程访问
- 第 4 步 - 配置防火墙访问 (UFW)
- 第 5 步 - 使用 Neo4j
- 结论
Neo4j 是一个用于创建数据关系的图形数据库。传统数据库中的数据保存在类似表的结构中。图形数据库记录数据节点之间的关系。每个节点都存储对其连接的所有其他节点的引用。传统数据库不直接保存关系数据,而是借助索引在数据结构中搜索来找出联系,这种方法既昂贵又费时。像 Neo4j 这样的图形数据库避免了所有这些开销,并且可以编码和查询复杂的关系。

Neo4j 由 Neo Technology 开发。它是用 Java 和 Scala 编写的,有免费的社区版和企业版。 Neo4j 使用自己的称为 Cypher 的查询语言,但可以用其他样式编写查询。
本教程将教您如何在 Ubuntu 22.04 服务器上安装和配置 Neo4j。
先决条件
-
A server running Ubuntu 22.04 with a minimum of 1 CPU core and 2 GB of memory. You will need to upgrade the server as per requirements.
-
A non-root user with sudo privileges.
-
Make sure everything is updated.
-
$ sudo apt update
-
Install basic utility packages. Some of them may already be installed.
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
第 1 步 - 安装 Neo4j
安装 Neo4j 的第一步是添加 GPG 密钥。
$ curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg
将 Neo4j 存储库添加到您的系统 APT 源目录。
$ echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable latest" | sudo tee -a /etc/apt/sources.list.d/neo4j.list
为避免升级到下一个主要版本的风险,您可以在上述命令中指定所需的主要和次要版本来代替 latest
。
以下命令将添加 Neo4j 5.x 存储库,这意味着无论何时发布,您都不会升级到 6.x 版本。
$ echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable 5" | sudo tee -a /etc/apt/sources.list.d/neo4j.list
更新系统存储库列表。
$ sudo apt update
列出可供安装的 Neo4j 版本。
$ apt list -a neo4j
Listing... Done
neo4j/stable 1:5.3.0 all
neo4j/stable 1:5.2.0 all
neo4j/stable 1:5.1.0 all
安装 Neo4j 社区版。
$ sudo apt install neo4j
您可以使用以下命令安装特定版本。
$ sudo apt install neo4j=1:5.3.0
请注意,根据 Debian 的版本控制政策,该版本包含纪元版本组件 (1:)。
Neo4j 会自动安装所需的 JDK 版本。
启用 Neo4j 服务。
$ sudo systemctl enable neo4j
启动 Neo4j 服务。
$ sudo systemctl start neo4j
检查 Neo4j 服务的状态。
$ sudo systemctl status neo4j
? neo4j.service - Neo4j Graph Database
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2023-01-21 20:50:52 UTC; 33s ago
Main PID: 5241 (java)
Tasks: 72 (limit: 1030)
Memory: 399.3M
CPU: 20.350s
CGroup: /system.slice/neo4j.service
第 2 步 - 测试连接
Neo4j 使用 Cypher Shell 来处理数据。
连接到 Cypher Shell。
$ cypher-shell
系统将提示您输入用户名和密码。默认的用户名和密码是 neo4j
。系统将要求您选择一个新密码。
username: neo4j
password:
Password change required
new password:
confirm password:
Connected to Neo4j using Bolt protocol version 5.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 DBMS。
输入 :exit
退出 shell。
> :exit
Bye!
第 3 步 - 配置 Neo4j 以进行远程访问
对于生产环境,您可能需要确认 Neo4j 接受来自远程主机的连接。默认情况下,Neo4j 只接受来自 localhost
的连接。
我们可以通过编辑 Neo4j 的配置文件来配置 Neo4j 以接受来自远程主机的连接。 Neo4j 将其设置存储在 /etc/neo4j/neo4j.conf
文件中。打开它进行编辑。
$ sudo nano /etc/neo4j/neo4j.conf
找到注释掉的行 #dbms.default_listen_address=0.0.0.0
并通过删除前导散列来取消注释。
. . .
#*****************************************************************
# Network connector configuration
#*****************************************************************
# With default configuration Neo4j only accepts local connections.
# To accept non-local connections, uncomment this line:
server.default_listen_address=0.0.0.0
. . .
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
默认情况下,值 0.0.0.0
会将 Neo4j 绑定到系统上所有可用的 IPv4 接口,包括本地主机。如果您想将 Neo4j 限制为特定的 IP 地址,例如私有网络 IP,请在此处指定分配给您服务器的私有网络接口的 IP 地址。
您还可以将 Neo4j 配置为使用 IPv6 接口。与 IPv4 一样,您可以将 default_listen_address
值设置为将用于与 Neo4j 通信的特定 IPv6 地址。如果你想限制 Neo4j 只为你的服务器使用本地 IPv6 地址,请指定 ::1
,它对应于使用 IPv6 表示法的 localhost。
如果您使用 IPv6 地址配置 Neo4j,您将无法直接使用 IPv6 地址连接 cypher-shell。相反,您需要配置一个解析为 IPv6 地址的 DNS 名称,或者在远程系统的 /etc/hosts
文件中添加一个条目,将地址映射到一个名称。然后,您将能够使用 DNS 或主机文件名从远程系统使用 IPv6 连接到 Neo4j。
例如,具有像 2001:db8::1
这样的 IPv6 地址的 Neo4j 服务器将要求远程连接系统具有 /etc/hosts
入口如下图。
2001:db8::1 your_hostname
然后,您可以使用您指定的名称从远程系统连接到服务器,如下所示。
$ cypher-shell -a 'neo4j://your_hostname:7687'
如果您限制 Neo4j 使用 ::1 的 IPv6 本地主机地址,那么您可以使用来自 /etc/hosts
的预配置 ip6-localhost 名称在 Neo4j 服务器本身本地连接到它文件如下所示。
$ cypher-shell -a 'neo4j://ip6-localhost:7687'
使用连接 URI 调用 cypher-shell
后,系统将像往常一样提示您输入用户名和密码。
第 4 步 - 配置防火墙访问 (UFW)
启用远程连接后,您可以使用防火墙来限制 Neo4j,以限制仅来自它可以连接到的受信任系统的连接。
Neo4j 创建两个网络套接字,一个在端口 7474 上用于内置 HTTP 接口,主要的螺栓协议在端口 7687 上。
Ubuntu 22.04 默认使用简单防火墙(UFW)。
使用以下命令配置防火墙以允许受信任的远程主机使用 IPv4 访问 bolt
接口。
$ sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp
用可信远程系统的 IP 地址代替 203.0.113.1
值。同样,您可以使用以下命令允许整个网络范围。
$ sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
用实际网络代替 192.0.2.0/24
值。
要允许使用 IPv6 访问远程主机,您可以使用以下命令。
$ sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp
用您信任的系统 IPv6 地址代替 2001:DB8::1/128
值。
与 IPv4 一样,您可以使用以下命令允许一系列 IPv6 地址。
$ ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
同样,用您信任的网络范围替换突出显示的 2001:DB8::/32 网络范围。
重新加载防火墙以应用更改。
$ sudo ufw reload
检查防火墙的状态。
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
7687/tcp ALLOW 203.0.113.1
第 5 步 - 使用 Neo4j
使用 cypher-shell
工具连接到 Neo4j。系统将提示您输入用户名和密码。
$ cypher-shell
如果您为远程访问配置了 Neo4j,则使用以下命令从远程系统连接到 Neo4j。
$ cypher-shell -a 'neo4j://203.0.113.1:7687'
这里 203.0.113.1
是 Neo4j 服务器的 IP 地址。
如果您使用的是 IPv6,请确保您有一个名称在步骤 3 中描述的 /etc/hosts
条目。然后按如下方式连接到 Neo4j 服务器。
$ cypher-shell -a 'neo4j://your_hostname:7687'
确保 your_hostname
映射到远程系统 /etc/hosts
文件中的 Neo4j 服务器 IPv6 地址。
让我们向 Neo4j 添加一个名为 Slite
的节点和作者姓名。以下命令将创建一个类型为 Slite
的节点,名称为 Navjot Singh
。
> CREATE (:Slite {name: 'Navjot Singh'});
您将获得以下输出。
0 rows
ready to start consuming query after 124 ms, results consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels
接下来,我们将添加更多员工,并使用名为 COLLEAGUE
的关系将他们关联起来。您可以使用任意命名的关系链接节点。
再添加三名员工并使用 COLLEAGUE
关系链接他们。
> CREATE
(:Slite {name: 'Sammy'})-[:COLLEAGUE]->
(:Slite {name: 'Peter Jack'})-[:COLLEAGUE]->
(:Slite {name: 'Chris Rock'});
您将获得类似的输出。
0 rows
ready to start consuming query after 72 ms, results consumed after another 0 ms
Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels
现在,让我们创建一些关系。
由于 Peter 和 Chris 在同一部门工作并且具有与节点相同的属性,因此我们将创建与名称列的关系。
> MATCH (a:Slite),(b:Slite)
WHERE a.name = 'Peter Jack' AND b.name = 'Chris Rock'
CREATE (a)-[r:DEPARTMENT { name: 'Designers' }]->(b)
RETURN type(r), r.name;
+----------------------------+
| type(r) | r.name |
+----------------------------+
| "DEPARTMENT" | "Designers" |
+----------------------------+
1 row
ready to start consuming query after 60 ms, results consumed after another 17 ms
Created 1 relationships, Set 1 properties
现在,让我们在 Sammy 和 Peter 之间创建另一个连接,因为他们在同一个项目上工作。
> MATCH (a:Slite), (b:Slite)
WHERE a.name = 'Peter Jack' AND b.name = 'Sammy' CREATE (a)-[r:PROJECT { name: 'Test Project 1' }]->(b) RETURN type(r), r.name;
+------------------------------+
| type(r) | r.name |
+------------------------------+
| "PROJECT" | "Test Project 1" |
+------------------------------+
1 row
ready to start consuming query after 132 ms, results consumed after another 12 ms
Created 1 relationships, Set 1 properties
让我们使用以下查询显示所有这些数据。
> MATCH (a)-[r]->(b)
RETURN a.name,r,b.name
ORDER BY r;
+-------------------------------------------------------------------+
| a.name | r | b.name |
+-------------------------------------------------------------------+
| "Sammy" | [:COLLEAGUE] | "Peter Jack" |
| "Peter Jack" | [:COLLEAGUE] | "Chris Rock" |
| "Peter Jack" | [:DEPARTMENT {name: "Designers"}] | "Chris Rock" |
| "Peter Jack" | [:PROJECT {name: "Test Project 1"}] | "Sammy" |
+-------------------------------------------------------------------+
4 rows
ready to start consuming query after 99 ms, results consumed after another 5 ms
结论
我们关于在 Ubuntu 22.04 服务器上安装和配置 Neo4j 的教程到此结束。如果您有任何问题,请在下面的评论中发表。