
如何在 Ubuntu 20.04 上安装和配置 Neo4j
如果您希望将 Neo4j 整合到使用多台服务器的大型应用程序或环境中,则需要将其配置为接受来自其他系统的连接。在此步骤中,您将配置 Neo4j 以允许远程连接,并且还将添加防火墙规则以限制哪些系统可以连接到您的 Neo4j 服务器。由于每个节点都存储对其所连接的所有其他节点的引用,因此 Neo4j 可以以最小的开销编码和查询复杂的关系。如果您想将 Neo4j 限制到特定的 IP 地址,例如服务器用
介绍
Neo4j是一个图形数据库,用于记录数据节点之间的关系,而传统的关系数据库则使用行和列来存储和构造数据。由于每个节点都存储对其所连接的所有其他节点的引用,因此 Neo4j 可以以最小的开销编码和查询复杂的关系。
先决条件
要遵循本教程,您需要满足以下条件:
- 一台 Ubuntu 20.04 服务器,按照Ubuntu 20.04 初始服务器设置指南进行设置,包括启用 sudo 的非root用户和防火墙。
第 1 步 - 安装 Neo4j
官方 Ubuntu 软件包存储库不包含 Neo4j 数据库引擎的副本。要从 Neo4j 安装上游支持的软件包,您需要从 Neo4j 添加 GPG 密钥以确保软件包下载有效。然后,您将添加指向 Neo4j 软件存储库的新软件包源,最后安装该软件包。
首先,下载以下 curl 命令并将其输出通过管道传输到gpg --dearmor
命令中。此步骤将密钥转换为 apt 可用于验证下载软件包的格式:
curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key |sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg
接下来,将 Neo4j 4.1 存储库添加到系统的 APT 源:
接下来,将 Neo4j 4.1 存储库添加到系统的 APT 源:
[signed-by=/usr/share/keyrings/neo4j.gpg]
该文件的部分指示使用apt
您下载的密钥来验证 neo4j 包的存储库和文件信息。
下一步是更新您的软件包列表,然后安装 Neo4j 软件包及其所有依赖项。此步骤将下载并安装兼容的 Java 软件包,因此您可以在命令提示您安装所有依赖项Y
时输入:apt
sudo apt update
sudo apt install neo4j
安装过程完成后,Neo4j 应该可以运行。但是,它并未设置为在系统重启时启动。因此,最后一个设置步骤是将其启用为服务,然后启动它:
sudo systemctl enable neo4j.service
sudo systemctl start neo4j.service
sudo systemctl start neo4j.service
第 2 步 - 连接并配置 Neo4j
现在您已经安装 Neo4j 并将其配置为在重启后运行,您可以测试连接到数据库并配置管理员凭据。
要在命令行上与 Neo4j 交互,请使用该cypher-shell
实用程序。像这样调用该实用程序:
cypher-shell
首次调用 shell 时,您将使用默认的管理neo4j
用户和neo4j
密码组合登录。通过身份验证后,Neo4j 将提示您更改管理员密码:
cypher-shell prompt
username: 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 数据库进行交互。
步骤 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
行并通过删除前导注释字符来取消注释#
。
/etc/neo4j/neo4j.conf
. . .
#*****************************************************************
# 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
:
/etc/hosts
. . .
2001:db8::1 your_hostname
然后,您将使用您指定的名称从远程系统连接到服务器,如下所示:
cypher-shell -a 'neo4j://your_hostname:7687'
如果您限制 Neo4j 使用localhost
的 IPv6 地址,那么您可以使用文件中的::1
预配置名称在 Neo4j 服务器上本地连接到它,如下所示:ip6-localhost
/etc/hosts
cypher-shell -a 'neo4j://ip6-localhost:7687'
现在您已将 Neo4j 配置为允许远程连接,限制远程访问非常重要,以便只有受信任的系统才能连接到它。要限制对 Neo4j 的远程访问,您可以使用 Ubuntu 的默认 UFW 防火墙。如果您遵循了必备的Ubuntu 20.04 初始服务器设置教程,则 UFW 已安装并可在您的服务器上使用。
Neo4j 在默认安装中创建两个网络套接字,一个在端口 7474 上用于内置 HTTP 接口,一个在端口 7687 上用于主bolt协议。Neo4j 建议不要在生产中使用 HTTP 端口,因此我们将仅为端口 7687 创建防火墙规则。
要配置防火墙以允许受信任的远程主机bolt
使用 IPv4 访问接口,请输入以下命令:
sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp
将突出显示的 IP 地址替换为用于访问 Neo4j 的受信任远程系统的 IP 地址203.0.113.1价值。
如果您想允许整个网络范围访问,例如私有管理或数据路径网络,请使用如下规则:
sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
第 4 步 - 使用 Neo4j
要开始使用 Neo4j,让我们添加一些示例节点,然后定义它们之间的关系。使用 连接到 Neo4j cypher-shell
。
cypher-shell
cypher-shell -a 'neo4j://your_hostname:7687'
使用用户名和密码登录 Neo4j 后,您可以查询并将节点和关系添加到数据库。
首先,将大白鲨节点添加到 Neo4j。以下命令将创建一个类型为 的节点Shark
,名称为Great White
。
CREATE (:Shark {name: 'Great White'});
执行每条命令后您将收到类似以下内容的输出:
Output
0 rows available after 3 ms, consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels
接下来,添加更多鲨鱼,并使用名为 的关系将它们关联起来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 还可以使用分类等级来关联。
萨米和巨齿鲨属于鼠类目。由于关系可以像节点一样具有属性,我们将创建一个ORDER
关系,并将name
属性设置为,Lamniformes
以帮助描述萨米和巨齿鲨的关系之一:
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 保护它。
如果您想了解有关使用 Neo4j 和cypher
查询语言的更多信息,请查阅官方 Neo4j 文档。
更多推荐
所有评论(0)