介绍
在本教程中,我们将研究 Neo4j 是什么、它的用途以及它是如何实现的。 我们还将在 Ubuntu 20.04 服务器上安装和配置安装。 Neo4j 是一个用于创建数据关系的图形数据库。 图形数据库的其他示例包括:
- ArangoDB
- 格拉肯核心
- 微软 SQL 服务器 2017
- 东方数据库
- RedisGraph
什么是 Neo4j
Neo4j 在存储数据时连接数据,允许我们运行我们以前从未知道或考虑过的查询。 简单来说,Neo4j 记录了数据节点之间的关系,而传统的关系数据库使用列和行来存储结构化数据。 由于每个节点都存储对它所连接的所有其他节点的引用,Neo4j 可以以最小的开销编码和查询复杂的关系。
由 Ahzf 最初上传(由 Obersachse 转让) – 最初上传于 en.wikipedia、CC0、https://commons.wikimedia.org/w/index.php?curid=19279472
Neo Technology 是开源软件 Neo4j 的创建者和开发者。 该公司自 2003 年以来一直在开发它。它是用 Java 和 Scala 编写的,源代码可在 GitHub 上免费获得。 截至 2015 年,它被认为是当今使用最多的图形数据库管理系统。 Neo4j 使用自己的查询语言 Cypher,但查询也可以用其他样式编写,例如 example,通过 Java API。
先决条件
对于此安装,该软件需要以下基线设置。
- 8 GB RAM 和四核服务器。 至少,建议使用 1 GB RAM 和单核服务器。
- Ubuntu 20.04 操作系统
- 所有命令都以 root 身份运行。 如果您是普通用户,则命令必须以 sudo 命令。
Neo4j 安装
添加存储库
Ubuntu 在标准包存储库中没有正式包含 Neo4j。 我们将添加指向 Neo4j 存储库位置的包源,然后添加来自 Neo4j 的 GPG 密钥进行验证,然后安装 Neo4j 本身。
我们首先更新包列表和包本身。
root@host:~# apt update && apt -y upgrade
添加附加软件
在此步骤中,我们将安装 HTTPS 连接所需的附加包。 此应用程序可能已默认安装在系统上,但仍需要更新。
root@host:~# apt install apt-transport-https ca-certificates curl software-properties-common -y
apt-transport-https 包通过使用 libapt-pkg 库的包管理器启用 https 的使用。 这样可以确保安装安全。
验证安全密钥
现在我们为 Neo4j 包存储库添加官方安全密钥。 此密钥检查并验证您正在安装的内容来自官方存储库。
root@host:~# curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | apt-key add -
OK
root@host:~#
添加存储库
将 Neo4j 官方存储库添加到包管理器列表中。
root@host:~# add-apt-repository "deb https://debian.neo4j.com stable 4.1"
安装 Neo4j
在安装 Neo4j 及其所有依赖项时,必须注意安装会提示我们安装 Java 包以使用 Neo4j。 在安装过程中,按 Y. 接受此软件安装。 如果您安装了 Java,安装程序将理解并跳过此步骤。
root@host:~# apt install neo4j -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libfprint-2-tod1
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
cypher-shell
The following NEW packages will be installed:
cypher-shell neo4j
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 116 MB of archives.
After this operation, 131 MB of additional disk space will be used.
Get:1 https://debian.neo4j.com stable/4.1 amd64 cypher-shell all 4.1.3 [27,1 MB]
Get:2 https://debian.neo4j.com stable/4.1 amd64 neo4j all 1:4.1.5 [88,4 MB]
Fetched 116 MB in 10s (11,1 MB/s)
Preconfiguring packages ...
Selecting previously unselected package cypher-shell.
(Reading database ... 163626 files and directories currently installed.)
Preparing to unpack .../cypher-shell_4.1.3_all.deb ...
Unpacking cypher-shell (4.1.3) ...
Selecting previously unselected package neo4j.
Preparing to unpack .../neo4j_1%3a4.1.5_all.deb ...
Unpacking neo4j (1:4.1.5) ...
Setting up cypher-shell (4.1.3) ...
Setting up neo4j (1:4.1.5) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for systemd (245.4-4ubuntu3.3) ...
root@host:~#
启动 Neo4j 服务
安装完成后,我们需要将其作为 neo4j.service 服务启用。
root@host:~# systemctl enable neo4j.service
Synchronizing state of neo4j.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable neo4j
Created symlink /etc/systemd/system/multi-user.target.wants/neo4j.service → /lib/systemd/system/neo4j.service.
root@host:~#
检查 Neo4j 状态
接下来,我们验证一切是否按预期工作。
root@host:~# systemctl status neo4j.service
neo4j.service - Neo4j Graph Database
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset:>
Active: active (running) since Wed 2020-12-23 20:04:44 +03; 2min 4s ago
Main PID: 4827 (java)
Tasks: 52 (limit: 9489)
Memory: 447.9M
CGroup: /system.slice/neo4j.service
└─4827 /usr/bin/java -cp /var/lib/neo4j/plugins:/etc/neo4j:/usr/sh>
сне 23 20:04:46 host neo4j[4827]: 2020-12-23 17:04:46.101+0000 INFO ======== N>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.073+0000 INFO Initializi>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.077+0000 INFO Setting up>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.077+0000 INFO Creating n>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.083+0000 INFO Setting ve>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.085+0000 INFO After init>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.088+0000 INFO Performing>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.197+0000 INFO Bolt enabl>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.843+0000 INFO Remote int>
сне 23 20:04:47 host neo4j[4827]: 2020-12-23 17:04:47.844+0000 INFO Started.
lines 1-19/19 (END)
To exit this screen, press Ctrl + C.
It is important to have the following parameters:
Loaded: loaded (/lib/systemd/system/neo4j.service; enabled; vendor preset:>
Active: active (running) since Wed 2020-12-23 20:04:44 +03; 2min 4s ago
测试数据库连接
由于我们安装了 Neo4j 并将其作为服务启动,我们现在将测试数据库连接并配置 admin 用户。
注意:我们使用的是免费的社区版 Neo4j 版本。 它支持同时使用同一个数据库,但不包括为用户分配角色和权限。
使用 Neo4j
为了与数据库交互,我们将启动名为 cypher-shell 的内部实用程序来使用 Neo4j。 当我们第一次运行它时,我们会被要求输入用户名和密码。 默认情况下,用户名是neo4j,密码是neo4j。 首次登录后,系统将提示您将密码更改为您选择的密码。
oot@host:~# cypher-shell
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>
要退出,请使用 exit 命令。
neo4j@neo4j> exit
Bye!
root@host:~#
添加节点
让我们设置一些示例节点并定义它们之间的关系。 使用 Cypher 连接
root@host:~# cypher-shell
username: neo4j
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>
接下来,让我们添加一个名为 Liquidweb 的节点以及在 Margaret 名称下为该公司工作的同事的姓名。 我们可以使用 CREATE 命令执行此操作,语法如下。
neo4j@neo4j> CREATE (:Liquidweb {name: 'Margaret'});
0 rows available after 36 ms, consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels
neo4j@neo4j>
添加用户
让我们再添加一些同事并将他们链接到他们工作的公司 Liquidweb。 我们将使用 FRIEND 命令进行连接。
neo4j@neo4j> CREATE (:Liquidweb {name: 'John'})-[:FRIEND]->
(:Liquidweb {name: 'Peter'})-[:FRIEND]->
(:Liquidweb {name: 'Chris'});
0 rows available after 38 ms, consumed after another 0 ms
Added 3 nodes, Created 2 relationships, Set 3 properties, Added 3 labels
neo4j@neo4j>
创建关系
由于 Peter 和 Chris 在同一个部门工作,并且具有与节点相同的属性,因此我们将创建与 name 列的关系。
neo4j@neo4j> MATCH (a:Liquidweb),(b:Liquidweb)
WHERE a.name = 'Peter' AND b.name = 'Chris'
CREATE (a)-[r:DEPARTMENT { name: 'Developers' }]->(b)
RETURN type(r), r.name;
+------------------------+
| type(r) | r.name |
+------------------------+
| "DEPARTMENT" | "Developers" |
+------------------------+
1 row available after 105 ms, consumed after another 10 ms
Created 1 relationships, Set 1 properties
neo4j@neo4j>
- MATCH – 这表示节点的对应关系。 在这种情况下,在一家公司 Liquidweb
- WHERE – 值之间
- CREATE – 创建和添加
- 返回 – 返回基地。
现在创建 John 和 Chris 之间的连接,虽然他们在不同的部门,但他们在同一个项目上工作。neo4j@neo4j> MATCH (a:Liquidweb),(b:Liquidweb)
WHERE a.name = 'John' AND b.name = 'Chris'
CREATE (a)-[r:PROJECT { name: 'Cool Project' }]->(b)
RETURN type(r), r.name;
+----------------------------+
| type(r) | r.name |
+----------------------------+
| "PROJECT" | "Cool Project" |
+----------------------------+
1 row available after 48 ms, consumed after another 5 ms
Created 1 relationships, Set 1 properties
neo4j@neo4j>
显示信息
现在我们将使用以下查询显示所有这些数据及其关系。
neo4j@neo4j> Match (n)-[r]->(m)
Return n,r,m;
+--------------------------------------------------------------------------------------------------+
| n | r | m |
+--------------------------------------------------------------------------------------------------+
| (:Liquidweb {name: "John"}) | [:FRIEND] | (:Liquidweb {name: "Peter"}) |
| (:Liquidweb {name: "John"}) | [:PROJECT {name: "Cool Project"}] | (:Liquidweb {name: "Chris"}) |
| (:Liquidweb {name: "Peter"}) | [:DEPARTMENT {name: "Developers"}] | (:Liquidweb {name: "Chris"}) |
| (:Liquidweb {name: "Peter"}) | [:FRIEND] | (:Liquidweb {name: "Chris"}) |
+--------------------------------------------------------------------------------------------------+
4 rows available after 17 ms, consumed after another 2 ms
neo4j@neo4j>
我们收到了具有以下 FRIEND 关系的输出数据,其中显示了 DEPARTMENT 和 PROJECT 之间的关系和以下数据关系。
要退出密码外壳,请运行 exit 命令。
neo4j@neo4j> :exit
Bye!
root@host:~#
设置到 Neo4j 的安全远程连接
我们并不总是能够从服务器本身连接到数据库。 如果我们想将应用程序配置为使用 Neo4j,我们需要将其配置为安全地连接到其他服务器。 此外,我们应该配置防火墙以限制哪些服务器可以连接到 Neo4j。
默认情况下,Neo4j 通过 localhost(127.0.0.1 – localhost – 用于测试应用程序而不使用其他服务器)进行连接。 此外,来自 localhost 的 Neo4j 的工作不会对 Internet 的公共访问开放。 只有有权访问本地网络的用户才能连接到 Neo4j。
配置 Neo4j
为了让 Neo4j 连接到其他服务器,我们需要更改配置文件 /etc/neo4j/neo4j.conf 的设置。 我们将使用 nano 编辑器来完成这项任务。 请记住,如果您不是 root,请使用 sudo 命令。
root@host:~# nano /etc/neo4j/neo4j.conf
root@host:~#
在网络连接器部分中找到该行
#dbms.default_listen_address=0.0.0.0
通过删除 # 符号取消注释此行,然后按 Ctrl + S 和 Ctrl + X 保存并退出编辑器。
0.0.0.0 值会将 Neo4j 绑定到所有可用的 IPv4 网络接口。 您可以将服务器用作数据路径的特定 IP 地址或网络。 您也可以将其配置为使用 IPv6 接口,但该设置有许多细微差别。 我们建议您阅读官方网站上的文档。
为远程连接配置防火墙
要为远程连接配置 Neo4j 软件,我们必须配置防火墙。 我们限制访问,以便只有受信任的系统才能连接到它。 在这种情况下,我们将使用默认的 Ubuntu 防火墙 UFW。
接下来,我们必须检查防火墙是否被激活。 如果它不活跃,我们必须启用它。
root@host:~# ufw enable
Firewall is active and enabled on system startup
root@host:~#
Neo4j 在安装软件时会创建两个网络套接字。 一个在端口 7474 上用于 HTTP 接口,一个在端口 7687 上用于主协议。Neo4j 建议使用端口 7687。打开端口的命令类似于以下用于允许 IPv4 地址的命令。
ufw allow from YOUR_IP to any port 7687 proto tcp
YOUR_IP - Use an IP here to provide access permission. If you want to allow access to the entire local network, use the following rule:
ufw allow from 192.168.50.0/16 to any port 7687 proto tcp
Enter 您的特定网络范围以打开端口。 对于 IPv6 地址,该命令将如下所示。
ufw allow from fe80::1006:f7a3:b9cc:b0cb to any port 7687 proto tcp
上述IP用作 example. 替换您的值并添加规则。
root@host:~# ufw allow from 192.168.50.189 to any port 7687 proto tcp
Rule added
root@host:~#
重启防火墙
请务必重新启动防火墙。
root@host:~# ufw reload
Firewall reloaded
root@host:~#
验证连接
现在让我们检查一下它是否工作正常。
root@host:~# ufw status
Status: active
To Action From
-- ------ ----
7687/tcp ALLOW 192.168.50.189
root@host:~#
有了这个,我们就有了一个可以工作的 Neo4j 服务器,它已经准备好运行并配置为允许访问端口 7687。
结论
我们遇到了 Neo4j 图形数据库,了解了它的工作原理以及为什么需要它。 设置包管理器,然后安装 Neo4j。 接下来,我们检查了功能,进入它并更改了密码。 我们尝试了有关如何创建表、建立关系和设置节点的基本命令。 最后,我们配置了与所需 IP 的连接,并配置了防火墙以确保安全。