介绍
Neo4j是一个图形数据库,记录数据节点之间的关系,而传统的关系数据库使用行和列来存储和结构数据。
前提条件
要遵循本教程,您将需要以下内容:
- 一个 Ubuntu 20.04 服务器通过遵循 Ubuntu 20.04 初始服务器安装指南设置,包括一个 sudo 启用的非root 用户和防火墙。
步骤 1 – 安装 Neo4j
官方的Ubuntu包存储库不包含Neo4j数据库引擎的副本. 要安装来自Neo4j的上游支持的包,您需要添加Neo4j的GPG密钥,以确保包的下载是有效的。
要开始,下载并将下列 curl 命令的输出管道到 gpg --dearmor
命令. 此步骤将将密钥转换为 apt 可用于验证下载的包的格式:
1curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key |sudo gpg --dearmor -o /usr/share/keyrings/neo4j.gpg
接下来,将 Neo4j 4.1 存储库添加到您的系统的 APT 源:
1echo "deb [signed-by=/usr/share/keyrings/neo4j.gpg] https://debian.neo4j.com stable 4.1" | sudo tee -a /etc/apt/sources.list.d/neo4j.list
文件的[signed-by=/usr/share/keyrings/neo4j.gpg]
部分指示apt
使用您下载的密钥来验证 neo4j 包的存储库和文件信息。
下一步是更新您的包列表,然后安装 Neo4j 包及其所有依赖程序. 此步骤将下载并安装兼容的 Java 包,因此您可以在apt
命令提示您安装所有依赖程序时输入Y
:
1sudo apt update
1sudo apt install neo4j
一旦安装过程完成,Neo4j 应该运行,但是,它没有设置为在系统重新启动时启动,所以最后的安装步骤是启用它作为服务,然后启动它:
1sudo systemctl enable neo4j.service
现在开始服务,如果它还没有运行:
1sudo systemctl start neo4j.service
完成所有这些步骤后,使用systemctl
命令检查Neo4j的状态:
1sudo systemctl status neo4j.service
你应该有类似于以下的输出:
1[secondary_label Output]
2● neo4j.service - Neo4j Graph Database
3 Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset: enabled)
4 Active: active (running) since Fri 2020-08-07 01:43:00 UTC; 6min ago
5 Main PID: 21915 (java)
6 Tasks: 45 (limit: 1137)
7 Memory: 259.3M
8 CGroup: /system.slice/neo4j.service
9. . .
将有其他可言的输出线,但重要的是要注意的是突出的启用
和运行
线条.一旦安装和运行Neo4j,您可以转到下一组步骤,这将指导您通过连接到Neo4j,配置凭据,并插入节点到数据库中。
步骤 2 — 连接和配置 Neo4j
现在,您已经安装了 Neo4j 并配置为在任何重新启动后运行,您可以测试连接到数据库并配置管理员凭证。
要在命令行上与 Neo4j 进行交互,请使用cipher-shell
实用程序:
1cypher-shell
当您首次调用壳时,您将使用默认的管理用户neo4j
和neo4j
密码组合登录。
1[secondary_label cypher-shell prompt]
2username: neo4j
3password: *****
4Password change required
5new password: ********************
6Connected to Neo4j 4.1.0 at neo4j://localhost:7687 as user neo4j.
7Type :help for a list of available commands or :exit to exit the shell.
8Note that Cypher queries must end with a semicolon.
9neo4j@neo4j>
在本示例中,突出的***** ****** ****** ***
是新密码的伪装版本。选择自己的强大而可记忆的密码,并确保在安全的地方记录它。一旦设置密码,您将连接到交互式neo4j@neo4j>
提示,您可以通过插入和查询节点与Neo4j数据库进行交互。
<$>[注意] 注意 :Neo4j的社区版支持一次运行单个数据库。此外,社区版本不包括将角色和权限分配给用户的功能,因此这些步骤不包括在本教程中。
现在你已经设置了一个管理员密码,并测试了连接到Neo4j,请通过键入:exit
来退出cypher-shell
提示:
1:exit
接下来,您可以选择配置Neo4j以接受远程连接。
步骤 3 (可选) — 配置 Neo4j 用于远程访问
如果您想将 Neo4j 集成到使用多个服务器的大型应用程序或环境中,则需要将其配置为接受来自其他系统的连接。
默认情况下,Neo4j配置为仅接受来自本地主机
的连接(‘127.0.0.1’是本地主机
的IP地址)。
要将 Neo4j 所使用的网络接口从localhost
更改为其他系统可以使用的网络接口,您需要编辑 /etc/neo4j/neo4j.conf’ 文件。 在您偏好的编辑器中打开配置文件,然后找到
dbms.default_listen_address设置。下面的示例使用
nano' 来编辑该文件:
1sudo nano /etc/neo4j/neo4j.conf
查找评论的#dbms.default_listen_address=0.0.0.0
行,并通过删除领先的#
评论字符删除评论。
1[label /etc/neo4j/neo4j.conf]
2. . .
3#*****************************************************************
4# Network connector configuration
5#*****************************************************************
6
7# With default configuration Neo4j only accepts local connections.
8# To accept non-local connections, uncomment this line:
9dbms.default_listen_address=0.0.0.0
10. . .
默认情况下,值 0.0.0.0
将 Neo4j 绑定到系统上的所有可用的 IPv4 接口,包括 localhost
. 如果您想将 Neo4j 限制在一个特定的 IP 地址上,例如服务器使用的私人网络 IP,请在这里指定为服务器的私人网络接口分配的 IP 地址。
您还可以配置 Neo4j 以使用 IPv6 接口. 与 IPv4 一样,您可以将 default_listen_address
值设置为您将使用的特定 IPv6 地址来与 Neo4j 通信。
当您完成配置 Neo4j 将用于连接的默认 IP 地址时,请保存并关闭neo4j.conf
。
<$>[注意]
注意 :如果您配置 Neo4j 以 IPv6 地址,您将无法直接使用 IPv6 地址连接到 Neo4j 以数字壳
。相反,您将需要配置一个 DNS 名称以解决 IPv6 地址,或者在远程系统的 `/etc/hosts 文件中添加一个条目,将地址绘制为一个名称。
例如,一个具有 IPv6 地址的 Neo4j 服务器,如 2001:db8::1 将要求远程连接系统具有如下类似的 /etc/hosts' 条目,取代一个名称,而不是突出的
your_hostname`:
1[label /etc/hosts]
2. . .
32001:db8::1 your_hostname
然后,您将使用您指定的名称从远程系统连接到服务器:
1cypher-shell -a 'neo4j://your_hostname:7687'
如果您限制 Neo4j 使用 IPv6 本地主机
地址 ::1,那么您可以在 Neo4j 服务器上使用从您的
/etc/hosts’ 文件中预配置的 ip6-localhost
名称本地连接到它,如下:
1cypher-shell -a 'neo4j://ip6-localhost:7687'
一旦您用连接URI调用cypher-shell
,您将像往常一样被要求提供您的用户名和密码。
现在你已经配置了Neo4j以允许远程连接,重要的是限制远程访问,以便只有可信赖的系统可以连接到它。 为了限制远程访问Neo4j,你可以使用Ubuntu的默认UFW防火墙。
Neo4j在默认安装中创建了两个网络接口,一个是用于内置的 HTTP 接口的 7474 端口,另一个是用于 7687 端口的主要 bolt
协议。
若要配置防火墙以允许可信的远程主机使用 IPv4 访问``接口,请输入以下命令:
1[label UFW IPv4 Single Host Example]
2sudo ufw allow from 203.0.113.1 to any port 7687 proto tcp
取代您将使用来访问 Neo4j 的受信任远程系统的 IP 地址,而不是突出的 203.0.113.1 值。
如果要允许整个网络范围的访问,例如私人管理或数据路径网络,请使用这样的规则:
1[label UFW IPv4 Network Example]
2sudo ufw allow from 192.0.2.0/24 to any port 7687 proto tcp
再次,取代您想要访问 Neo4j 的网络,而不是突出的 192.0.2.0/24 网络。
如果您想允许主机使用 IPv6 远程访问 Neo4j,请添加如下这样的规则:
1[label UFW IPv6 Single Host Example]
2sudo ufw allow from 2001:DB8::1/128 to any port 7687 proto tcp
更换您的受信任系统的 IPv6 地址,而不是突出的 2001:DB8::1/128 地址。
与IPv4一样,您还可以允许一系列IPv6地址访问您的Neo4j服务器。
1[label UFW IPv6 Single Host Example]
2sudo ufw allow from 2001:DB8::/32 to any port 7687 proto tcp
再次更换您信任的网络范围,而不是突出的2001:DB8::/32
网络范围。
一旦您为您的网络配置和受信任的主机或网络创建了适当的 UFW 规则或规则,请允许 UFW 使规则生效:
1sudo ufw reload
您可以使用ufw status
命令检查当前加载的 UFW 规则,运行它以确保您指定的地址或网络可以在端口 7687 上访问 Neo4j:
1sudo ufw status
你应该有类似于以下的输出:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
622/tcp ALLOW Anywhere
722/tcp (v6) ALLOW Anywhere (v6)
87687/tcp ALLOW 203.0.113.1
您现在有一个 Neo4j 服务器,该服务器已配置为允许在端口 7687 上访问可靠的远程服务器或网络,在本教程的下一节中,您将了解如何将节点添加到数据库中,以及如何定义它们之间的关系。
步骤 4 — 使用 Neo4j
要开始使用 Neo4j,让我们添加一些示例节点,然后定义它们之间的关系。
1cypher-shell
<$>[注] 注 :如果您在 [步骤 3 (可选) — 配置 Neo4j for Remote Access](步骤 3 可选配置-neo4j-for-remote-access)中配置了 Neo4j 以允许远程访问,则使用与您的 Neo4j 服务器地址相符的 URI 连接。
1cypher-shell -a 'neo4j://203.0.113.1:7687'
您将像往常一样被要求提供您的用户名和密码。
如果您正在使用 IPv6,请确保您有一个/etc/hosts
的名称,如步骤 3 所述,然后从远程系统连接到您的 Neo4j 服务器,使用一个cypher-shell
命令,如下:
1cypher-shell -a 'neo4j://your_hostname:7687'
再次,确保突出的您的_主机名称
地图到您的远程系统的/etc/hosts
文件中的 Neo4j 服务器的 IPv6 地址。
一旦使用您的用户名和密码登录 Neo4j,您可以查询并将节点和关系添加到数据库中。
要开始,请将一个大白鲨节点添加到 Neo4j. 下面的命令将创建一个类型的节点Shark
,名为大白
。
1CREATE (:Shark {name: 'Great White'});
每个命令后,您将收到类似于以下的输出:
1[secondary_label Output]
20 rows available after 3 ms, consumed after another 0 ms
3Added 1 nodes, Set 1 properties, Added 1 labels
<$>[注]
注 :以下每个数字
查询的完整解释超出了本教程的范围。有关数字
查询语言的语法的详细信息,请参阅 The Neo4j Cypher Manual 。
<$>
接下来,添加一些更多的鲨鱼,并使用名为FRIEND
的关系来关系它们。Neo4j允许您将节点与任意命名的关系联系起来,因此FRIEND
可以是您想要使用的关系的任何标签。
在下面的示例中,我们将添加三个鲨鱼,并使用名为FRIEND
的关系将它们连接在一起:
1CREATE
2(:Shark {name: 'Hammerhead'})-[:FRIEND]->
3(:Shark {name: 'Sammy'})-[:FRIEND]->
4(:Shark {name: 'Megalodon'});
您应该收到输出,表示三个新鲨鱼被添加到数据库:
1[secondary_label Output]
2. . .
3Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels
Neo4j 允许您使用任意的关系名称来关联节点,因此除了它们现有的FRIEND
关系外,Sammy 和 Megalodon 还可以使用分类等级进行关联。
Sammy 和 Megalodon 共享一个共同的 Lamniformes 顺序. 由于关系可以像节点一样具有属性,我们将创建一个命令
关系,具有一个名称
属性,设置为Lamniformes
,以帮助描述 Sammy 和 Megalodon 的关系之一:
1MATCH (a:Shark),(b:Shark)
2WHERE a.name = 'Sammy' AND b.name = 'Megalodon'
3CREATE (a)-[r:ORDER { name: 'Lamniformes' }]->(b)
4RETURN type(r), r.name;
添加该关系后,您应该有如下类似的输出:
1[secondary_label Output]
2+-------------------------+
3| type(r) | r.name |
4+-------------------------+
5| "ORDER" | "Lamniformes" |
6+-------------------------+
7
81 row available after 2 ms, consumed after another 7 ms
9Created 1 relationships, Set 1 properties
接下来,添加Sammy和Hammerhead之间的SUPERORDER
关系,基于他们的分类超级顺序,即Selachimorpha。
1MATCH (a:Shark),(b:Shark)
2WHERE a.name = 'Sammy' AND b.name = 'Hammerhead'
3CREATE (a)-[r:SUPERORDER { name: 'Selachimorpha'}]->(b)
4RETURN type(r), r.name;
再次,您将收到指示关系类型的输出,以及用于描述关系添加的名称:
1[secondary_label Output]
2+--------------------------------+
3| type(r) | r.name |
4+--------------------------------+
5| "SUPERORDER" | "Selachimorpha" |
6+--------------------------------+
7
81 row available after 2 ms, consumed after another 8 ms
9Created 1 relationships, Set 1 properties
最后,随着所有这些节点和关系在 Neo4j 中定义和存储,使用以下查询来检查数据:
1MATCH (a)-[r]->(b)
2RETURN a.name,r,b.name
3ORDER BY r;
您应该获得如下类型的输出:
1[secondary_label Output]
2+---------------------------------------------------------------------+
3| a.name | r | b.name |
4+---------------------------------------------------------------------+
5| "Hammerhead" | [:FRIEND] | "Sammy" |
6| "Sammy" | [:FRIEND] | "Megalodon" |
7| "Sammy" | [:ORDER {name: "Lamniformes"}] | "Megalodon" |
8| "Sammy" | [:SUPERORDER {name: "Selachimorpha"}] | "Hammerhead" |
9+---------------------------------------------------------------------+
10
114 rows available after 72 ms, consumed after another 1 ms
输出包括Hammerhead,Sammy和Megalodon之间定义的FRIEND
关系,以及ORDER
和SUPERORDER
分类关系。
当您完成在您的 Neo4j 数据库中添加和探索节点和关系时,请键入 :exit
命令,留下 cypher-shell
。
结论
您现在已经安装、配置并在您的服务器上添加了数据 Neo4j. 您还可选地配置 Neo4j 以接受来自远程系统的连接,并使用 UFW 保护它。
如果您想了解有关使用Neo4j和cypher
查询语言的更多信息,请参阅官方
Neo4j 文档。