介绍
Neo4j是一个记录数据节点之间关系的图数据库,而传统的关系数据库使用行和列来存储和构建数据。由于每个节点都存储对其连接的所有其他节点的引用,因此 Neo4j 可以以最小的开销编码和查询复杂的关系。
先决条件
要遵循本教程,您将需要以下内容:
- 按照Ubuntu 20.04 初始服务器设置指南设置了一台 Ubuntu 20.04 服务器,包括启用 sudo 的非root用户和防火墙。
步骤 1 — 安装 Neo4j
官方 Ubuntu 软件包存储库不包含 Neo4j 数据库引擎的副本。要从 Neo4j 安装上游支持的包,我们将添加一个指向 Neo4j 存储库的新包源,添加来自 Neo4j 的 GPG 密钥以确保下载有效,然后安装包。
首先,更新您现有的软件包列表:
- sudo apt update
接下来,安装一些必备软件包,这将允许apt
使用 HTTPS 连接安装软件包。您的系统可能已经默认安装了这些软件包,但无论如何运行以下命令是安全的。
- sudo apt install apt-transport-https ca-certificates curl software-properties-common
现在将官方 Neo4j 包存储库的 GPG 密钥添加到您的系统。此密钥将确保您可以信任从上游存储库安装的 Neo4j 包。运行以下命令安装密钥:
- curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add -
接下来,将 Neo4j 4.1 存储库添加到您系统的 APT 源中:
- sudo add-apt-repository "deb https://debian.neo4j.com stable 4.1"
下一步是安装 Neo4j 包及其所有依赖项。这一步会下载并安装一个兼容的Java包,所以Y
当apt
命令提示你安装所有依赖时你可以输入:
- sudo apt install neo4j
安装过程完成后,Neo4j 应该正在运行。但是,它没有设置为在系统重新启动时启动。所以最后的设置步骤是将其作为服务启用:
- sudo systemctl enable 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 2020-08-07 01:43:00 UTC; 6min ago
Main PID: 21915 (java)
Tasks: 45 (limit: 1137)
Memory: 259.3M
CGroup: /system.slice/neo4j.service
. . .
还会有其他详细的输出线,但需要注意的重要事情是突出显示enabled
和running
线条。安装并运行 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,cypher-shell
输入:exit
以下命令退出提示:
- :exit
接下来,您可以选择配置 Neo4j 以接受远程连接。
第 3 步(可选)——为远程访问配置 Neo4j
如果您想将 Neo4j 合并到使用多个服务器的更大应用程序或环境中,那么您需要将其配置为接受来自其他系统的连接。在这一步中,您将配置 Neo4j 以允许远程连接,并且您还将添加防火墙规则来限制哪些系统可以连接到您的 Neo4j 服务器。
默认情况下,Neo4j 配置为localhost
仅接受来自(127.0.0.1
是 的 IP 地址localhost
) 的连接。此配置可确保您的 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
行并通过删除前导#
注释字符来取消注释。
. . .
#*****************************************************************
# 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
,这对应于localhost
使用 IPv6 表示法。
完成配置 Neo4j 将用于连接的默认 IP 地址后,保存并关闭neo4j.conf
。如果你使用nano
,你可以通过按这样做CTRL+X
,然后Y
再ENTER
。
注意:如果您使用 IPv6 地址配置 Neo4j,您将无法cypher-shell
直接使用 IPv6 地址连接到 Neo4j 。相反,您需要配置一个解析为 IPv6 地址的 DNS 名称,或者在远程系统的/etc/hosts
文件中添加一个条目,将地址映射到一个名称。然后,您将能够使用 DNS 或主机文件名从远程系统使用 IPv6 连接到 Neo4j。
例如,具有 IPv6 地址的 Neo4j 服务器2001:db8::1
需要远程连接系统具有如下所示的/etc/hosts
条目,用名称代替突出显示的your_hostname
:
. . .
2001:db8::1 your_hostname
然后,您将使用您指定的名称从远程系统连接到服务器,如下所示:
- cypher-shell -a 'neo4j://your_hostname:7687'
如果您限制 Neo4j 使用 的 IPv6localhost
地址::1
,那么您可以使用文件中的预配置ip6-localhost
名称在 Neo4j 服务器本身本地连接到它,/etc/hosts
如下所示:
- cypher-shell -a 'neo4j://ip6-localhost:7687'
cypher-shell
使用连接 URI调用后,系统将照常提示您输入用户名和密码。
现在您已将 Neo4j 配置为允许远程连接,重要的是限制远程访问,以便只有受信任的系统才能连接到它。要限制对 Neo4j 的远程访问,您可以使用 Ubuntu 的默认 UFW 防火墙。如果您遵循Ubuntu 20.04 教程中的初始服务器设置的先决条件,则 UFW 已经安装并可以在您的服务器上使用。
Neo4j 在默认安装中创建了两个网络套接字,一个在 7474 端口用于内置 HTTP 接口,主要bolt
协议在 7687 端口。 Neo4j 建议不要在生产中使用 HTTP 端口,因此我们将为端口 7687 创建防火墙规则只要。
要配置防火墙以允许受信任的远程主机bolt
使用 IPv4访问接口,请键入以下命令:
- sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp
替换您将用于访问 Neo4j 的可信远程系统的 IP 地址,而不是突出显示的203.0.113.1值。
如果要允许整个网络范围访问,例如私有管理或数据路径网络,请使用如下规则:
- sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
同样,替换您想要访问 Neo4j 的网络,而不是突出显示的192.0.2.0/24网络。
如果您想允许主机使用 IPv6 远程访问 Neo4j,请添加如下规则:
- sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp
用您信任的系统的 IPv6 地址代替突出显示的2001:DB8::1/128
地址。
与 IPv4 一样,您还可以允许一系列 IPv6 地址访问您的 Neo4j 服务器。为此,请创建如下所示的 UFW 规则:
- 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
您现在有一个 Neo4j 服务器,该服务器配置为允许通过端口 7687 访问受信任的远程服务器或网络。在本教程的下一部分中,您将了解如何向数据库添加节点,以及如何定义它们之间的关系。
第 4 步 – 使用 Neo4j
要开始使用 Neo4j,让我们添加一些示例节点,然后定义它们之间的关系。使用cypher-shell
.
- cypher-shell
注意:如果您在 [Step 3 (Optional) — Configure Neo4j for Remote Access](step-3-optional-configuring-neo4j-for-remote-access] 中将 Neo4j 配置为允许远程访问,请使用对应于您的 Neo4j 服务器的地址。例如,如果您的 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 添加一个 Great Whiteshark 节点。以下命令将创建一个类型为 的节点,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 Manual。
接下来,添加更多鲨鱼,并使用名为 的关系将它们关联起来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 目。由于关系可以像节点一样具有属性,我们将ORDER
使用name
设置Lamniformes
为帮助描述 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
接下来,添加SUPERORDER
Sammy 和 Hammerhead 之间基于它们的分类超目 Selachimorpha 的关系。同样,关系被赋予一个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
输出包括FRIEND
在 Hammerhead、Sammy 和 Megalodon 之间定义的关系,以及ORDER
和SUPERORDER
分类关系。
完成向 Neo4j 数据库添加和探索节点和关系后,键入:exit
命令以离开cypher-shell
.
结论
您现在已经在服务器上安装、配置和添加数据到 Neo4j。您还可以选择将 Neo4j 配置为接受来自远程系统的连接并使用 UFW 对其进行保护。