如何在 Ubuntu 20.04 上安装和配置 Neo4j

介绍

Neo4j是一个记录数据节点之间关系的图数据库,而传统的关系数据库使用行和列来存储和构建数据。由于每个节点都存储对其连接的所有其他节点的引用,因此 Neo4j 可以以最小的开销编码和查询复杂的关系。

先决条件

要遵循本教程,您将需要以下内容:

步骤 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包,所以Yapt命令提示你安装所有依赖你可以输入

  • 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 . . .

还会有其他详细的输出线,但需要注意的重要事情是突出显示enabledrunning线条。安装并运行 Neo4j 后,您可以继续执行下一组步骤,这些步骤将指导您连接到 Neo4j、配置凭据以及将节点插入数据库。

第 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 数据库进行交互。

注意: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行并通过删除前导#注释字符来取消注释

/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,然后YENTER

注意:如果您使用 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 使用 的 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访问接口,请键入以下命令:

UFW IPv4 单主机示例
  • sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp

替换您将用于访问 Neo4j 的可信远程系统的 IP 地址,而不是突出显示的203.0.113.1值。

如果要允许整个网络范围访问,例如私有管理或数据路径网络,请使用如下规则:

UFW IPv4 网络示例
  • sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp

同样,替换您想要访问 Neo4j 的网络,而不是突出显示的192.0.2.0/24网络。

如果您想允许主机使用 IPv6 远程访问 Neo4j,请添加如下规则:

UFW IPv6 单主机示例
  • sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp

用您信任的系统的 IPv6 地址代替突出显示的2001:DB8::1/128地址。

与 IPv4 一样,您还可以允许一系列 IPv6 地址访问您的 Neo4j 服务器。为此,请创建如下所示的 UFW 规则:

UFW IPv6 单主机示例
  • 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

您应该有类似于以下内容的输出:

Output
Status: 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'});

在每个命令之后,您将收到类似于以下内容的输出:

Output
0 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

接下来,添加更多鲨鱼,并使用名为 的关系将它们关联起来FRIENDNeo4j 允许您将节点与任意命名的关系相关联,因此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

接下来,添加SUPERORDERSammy 和 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 之间定义关系,以及ORDERSUPERORDER分类关系。

完成向 Neo4j 数据库添加和探索节点和关系后,键入:exit命令以离开cypher-shell.

结论

您现在已经在服务器上安装、配置和添加数据到 Neo4j。您还可以选择将 Neo4j 配置为接受来自远程系统的连接并使用 UFW 对其进行保护。

如果您想了解有关使用 Neo4j 和cypher查询语言的更多信息,请参阅
Neo4j官方文档

觉得文章有用?

点个广告表达一下你的爱意吧 !😁