本页内容

  • 准备工作
  • 步骤一 - 安装 Neo4j
  • 步骤二 - 测试连接
  • 步骤三 - 配置 Neo4j 以允许远程访问
  • 步骤四 - 配置防火墙访问(UFW)
  • 步骤五 - 使用 Neo4j
  • 总结

Neo4j 是一种用于建立数据关系的图数据库。传统数据库中的数据以类似表格的结构保存。图数据库则记录数据节点之间的关系,每个节点都保存着它所连接的所有其他节点的引用。传统数据库不会直接保存关系数据,而是借助索引在数据结构中进行检索来推断连接关系,这种方式既耗费资源又耗时。像 Neo4j 这样的图数据库避免了所有这些开销,能够对复杂关系进行编码和查询。

在 Ubuntu 22.04 上安装配置 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 的教程就结束了。如果你有任何疑问,请在下方评论区留言。