本页内容
- 准备工作
- 步骤一 - 安装 Neo4j
- 步骤二 - 测试连接
- 步骤三 - 配置 Neo4j 以允许远程访问
- 步骤四 - 配置防火墙访问(UFW)
- 步骤五 - 使用 Neo4j
- 总结
Neo4j 是一种用于建立数据关系的图数据库。传统数据库中的数据以类似表格的结构保存。图数据库则记录数据节点之间的关系,每个节点都保存着它所连接的所有其他节点的引用。传统数据库不会直接保存关系数据,而是借助索引在数据结构中进行检索来推断连接关系,这种方式既耗费资源又耗时。像 Neo4j 这样的图数据库避免了所有这些开销,能够对复杂关系进行编码和查询。

Neo4j 由 Neo Technology 公司开发,使用 Java 和 Scala 编写,提供免费的社区版和企业版两种版本。Neo4j 使用名为 Cypher 的专有查询语言,但查询也可以用其他风格来编写。
本教程将教你如何在 Ubuntu 22.04 服务器上安装并配置 Neo4j。
准备工作
- 一台运行 Ubuntu 22.04 的服务器,至少配备 1 个 CPU 核心和 2 GB 内存。你可能需要根据实际需求升级服务器配置。
- 一个具有 sudo 权限的非 root 用户。
- 确保系统软件包均为最新。
- $ sudo apt update
- 安装基础工具包。其中部分可能已安装。$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
一台运行 Ubuntu 22.04 的服务器,至少配备 1 个 CPU 核心和 2 GB 内存。你可能需要根据实际需求升级服务器配置。
一个具有 sudo 权限的非 root 用户。
确保系统软件包均为最新。
$ sudo apt update
安装基础工具包。其中部分可能已安装。
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
步骤一 - 安装 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
请注意,该版本号包含一个 epoch 版本组件(1:),这符合 Debian 的版本号规范。
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
步骤二 - 测试连接
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@neo4j>
这表明已成功连接到 Neo4j 数据库管理系统。
输入 :exit 退出 shell。
neo4j@neo4j> :exit
Bye!
步骤三 - 配置 Neo4j 以允许远程访问
在生产环境中,你可能需要让 Neo4j 接受来自远程主机的连接。默认情况下,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 表示的本地回环地址。
如果你为 Neo4j 配置了 IPv6 地址,将无法直接使用该 IPv6 地址通过 cypher-shell 连接。相反,你需要配置一个解析到该 IPv6 地址的 DNS 名称,或者在远程系统的 /etc/hosts 文件中添加一条将该地址映射为名称的条目。之后,你就可以使用该 DNS 或 hosts 文件中的名称,从远程系统通过 IPv6 连接到 Neo4j。
例如,一台 IPv6 地址为 2001:db8::1 的 Neo4j 服务器,需要远程连接系统在其 /etc/hosts 文件中包含如下所示的条目。
2001:db8::1 your_hostname
随后,你就可以从远程系统使用你指定的名称连接到该服务器,如下所示。
$ cypher-shell -a 'neo4j://your_hostname:7687'
如果你将 Neo4j 限制为使用 ::1 这个 IPv6 本地回环地址,那么你可以直接在 Neo4j 服务器本机上,使用 /etc/hosts 文件中预配置的 ip6-localhost 名称进行本地连接,如下所示。
$ cypher-shell -a 'neo4j://ip6-localhost:7687'
一旦你通过连接 URI 调用 cypher-shell,系统会像往常一样提示你输入用户名和密码。
步骤四 - 配置防火墙访问(UFW)
在启用远程连接之后,你可以使用防火墙对 Neo4j 加以限制,使其仅允许来自可信系统的连接。
Neo4j 会创建两个网络套接字,一个位于端口 7474,用于内置的 HTTP 接口;另一个位于端口 7687,用于主要的 bolt 协议。
Ubuntu 22.04 默认使用 Uncomplicated Firewall(UFW)防火墙。
使用以下命令配置防火墙,允许某个可信远程主机通过 IPv4 访问 bolt 接口。
$ sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp
将命令中的 203.0.113.1 替换为可信远程系统的 IP 地址。同样地,你也可以使用以下命令允许整个网络范围。
$ 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
将 2001:DB8::1/128 替换为你可信系统的 IPv6 地址。
与 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
步骤五 - 使用 Neo4j
使用 cypher-shell 工具连接到 Neo4j。系统会提示你输入用户名和密码。
$ cypher-shell
如果你已为远程访问配置了 Neo4j,则使用以下命令从远程系统连接到 Neo4j。
$ cypher-shell -a 'neo4j://203.0.113.1:7687'
这里的 203.0.113.1 是 Neo4j 服务器的 IP 地址。
如果你使用的是 IPv6,请确保已按步骤三所述在 /etc/hosts 文件中添加了一条带名称的条目。然后按如下方式连接到 Neo4j 服务器。
$ cypher-shell -a 'neo4j://your_hostname:7687'
请确保 your_hostname 在远程系统的 /etc/hosts 文件中映射到你的 Neo4j 服务器的 IPv6 地址。
让我们向 Neo4j 中添加一个名为 Slite 的节点以及作者姓名。以下命令将创建一个类型为 Slite、名称为 Navjot Singh 的节点。
neo4j@neo4j> 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 关系将它们关联起来。
neo4j@neo4j> 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 在同一部门工作,并且作为节点具有相同的属性,我们将创建一个名为 column 的关系。
neo4j@neo4j> 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 正在参与同一个项目,让我们在他们之间创建另一个连接。
neo4j@neo4j> 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
让我们使用以下查询来显示所有这些数。
neo4j@neo4j> 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 的教程就结束了。如果你有任何疑问,请在下方评论区留言。