[ad_1]
介绍
在本教程中,我们将研究 Neo4j 是什么、它的用途以及它是如何实现的。 我们还将在 Ubuntu 20.04 服务器上安装和配置安装。 Neo4j 是用于创建数据关系的图形数据库。 图形数据库的其他示例包括:
- 数据库
- 核心
- 微软 SQL Server 2017
- 东方数据库
- RedisGraph
什么是 Neo4j
Neo4j 连接存储的数据,允许我们运行我们以前从未知道或考虑过的查询。 简单来说,Neo4j 记录的是数据节点之间的关系,而传统的关系型数据库使用列和行来存储结构化数据。 由于每个节点都存储对其连接的所有其他节点的引用,因此 Neo4j 可以以最小的开销编码和查询复杂的关系。
Neo Technology 是开源软件 Neo4j 的创建者和开发者。 该公司自 2003 年以来一直在开发它。它是用 Java 和 Scala 编写的,源代码可在 GitHub 上免费获得。 截至 2015 年,它被认为是当今使用最多的图形数据库管理系统。 Neo4j 使用自己的查询语言 Cypher,但查询也可以用其他样式编写,例如通过 Java API。
先决条件
对于此安装,软件需要以下基线设置。
- 8 GB RAM 和四核服务器。 建议至少使用 1 GB RAM 和单核服务器。
- Ubuntu 20.04 操作系统
- 所有命令都以 root 身份运行。 如果您是普通用户,则命令必须以 sudo 命令。
Neo4j 安装
添加存储库
Ubuntu 在标准包存储库中没有正式包含 Neo4j。 我们将添加指向 Neo4j 存储库位置的包源,然后添加来自 Neo4j 的 GPG 密钥进行验证,然后安装 Neo4j 本身。
我们首先更新包列表和包本身。
[email protected]:~# apt update && apt -y upgrade
添加附加软件
在此步骤中,我们将安装 HTTPS 连接所需的附加包。 此应用程序可能已默认安装在系统上,但仍需要更新。
[email protected]:~# apt install apt-transport-https ca-certificates curl software-properties-common -y
apt-transport-https 包允许使用 libapt-pkg 库通过包管理器使用 https。 这样可以保证安装安全。
验证安全密钥
现在我们为 Neo4j 包存储库添加官方安全密钥。 此密钥检查并验证您正在安装的内容来自官方存储库。
[email protected]:~# curl -fsSL https://debian.neo4j.com/neotechnology.gpg.key | apt-key add -
OK
[email protected]:~#
添加存储库
将官方 Neo4j 存储库添加到包管理器列表中。
[email protected]:~# add-apt-repository "deb https://debian.neo4j.com stable 4.1"
安装 Neo4j
在安装 Neo4j 及其所有依赖项时,必须注意安装会提示我们安装 Java 包以与 Neo4j 一起使用。 在安装过程中,按 Y. 接受此软件安装。 如果您安装了 Java,安装程序会理解并跳过此步骤。
[email protected]:~# 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) ...
[email protected]:~#
启动 Neo4j 服务
安装完成后,我们需要将其启用为 neo4j.service 服务。
[email protected]:~# 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.
[email protected]:~#
检查 Neo4j 状态
接下来,我们验证一切是否按预期工作。
[email protected]:~# 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。 第一次登录后,系统会提示您将密码更改为您选择的密码。
[email protected]:~# 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.
[email protected]>
要退出,请使用 exit 命令。
[email protected]> exit
Bye!
[email protected]:~#
添加节点
让我们设置一些示例节点并定义它们之间的关系。 使用 Cypher 连接
[email protected]:~# 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.
[email protected]>
接下来,让我们添加一个名为 Liquidweb 的节点以及在名为 Margaret 的名称下为该公司工作的同事的姓名。 我们可以使用 CREATE 命令来做到这一点,语法如下。
[email protected]> CREATE (:Liquidweb {name: 'Margaret'});
0 rows available after 36 ms, consumed after another 0 ms
Added 1 nodes, Set 1 properties, Added 1 labels
[email protected]>
添加用户
让我们再添加一些同事,并将他们与他们工作的公司 Liquidweb 联系起来。 我们将使用 FRIEND 命令进行连接。
[email protected]> 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
[email protected]>
建立关系
由于 Peter 和 Chris 在同一部门工作并且具有与节点相同的属性,因此我们将创建与 name 列的关系。
[email protected]> 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
[email protected]>
- MATCH – 这表示节点的对应关系。 在这种情况下,在一家公司 Liquidweb 内
- WHERE – 值之间
- CREATE – 创建和添加
- 返回 – 返回基地。
现在在 John 和 Chris 之间建立连接,虽然他们在不同的部门,但他们在同一个项目上工作。[email protected]> 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
[email protected]>
显示信息
现在我们将使用以下查询显示所有这些数据及其关系。
[email protected]> 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
[email protected]>
我们收到的输出数据具有以下 FRIEND 关系,其中显示了 DEPARTMENT 和 PROJECT 之间的关系以及以下数据关系。
要退出密码外壳,请运行 exit 命令。
[email protected]> :exit
Bye!
[email protected]:~#
设置到 Neo4j 的安全远程连接
我们并不总是能够从服务器本身连接到数据库。 如果我们想将应用程序配置为使用 Neo4j,我们需要将其配置为安全地连接到其他服务器。 此外,我们应该配置防火墙以限制哪些服务器可以连接到 Neo4j。
默认情况下,Neo4j 通过 localhost 连接(127.0.0.1 – localhost – 用于测试应用程序,而无需与其他服务器一起使用)。 此外,来自 localhost 的 Neo4j 的工作不会对 Internet 的公共访问开放。 只有能够访问本地网络的用户才能连接到 Neo4j。
配置 Neo4j
为了让 Neo4j 连接到其他服务器,我们需要更改配置文件 /etc/neo4j/neo4j.conf 的设置。 我们将使用 nano 编辑器来完成这项任务。 请记住,如果您不是 root,请使用 sudo 命令。
[email protected]:~# nano /etc/neo4j/neo4j.conf
[email protected]:~#
在网络连接器部分找到该行
#dbms.default_listen_address=0.0.0.0
通过删除 # 符号取消注释此行,然后按 Ctrl + S 和 Ctrl + X 保存并退出编辑器。
0.0.0.0 值会将 Neo4j 绑定到所有可用的 IPv4 网络接口。 您可以将服务器用作数据路径的特定 IP 地址或网络。 您还可以将其配置为使用 IPv6 接口,但该设置有许多细微差别。 我们建议您阅读官方网站上的文档。
为远程连接配置防火墙
要配置 Neo4j 软件进行远程连接,我们必须配置防火墙。 我们限制访问,以便只有受信任的系统才能连接到它。 在这种情况下,我们将使用默认的 Ubuntu 防火墙 UFW。
接下来,我们必须检查防火墙是否被激活。 如果它不活动,我们必须启用它。
[email protected]:~# ufw enable
Firewall is active and enabled on system startup
[email protected]:~#
Neo4j 在安装软件时会创建两个网络套接字。 一个用于 HTTP 接口的端口 7474 和端口 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为例。 替换您的值并添加规则。
[email protected]:~# ufw allow from 192.168.50.189 to any port 7687 proto tcp
Rule added
[email protected]:~#
重启防火墙
请务必重新启动防火墙。
[email protected]:~# ufw reload
Firewall reloaded
[email protected]:~#
验证连接
现在让我们检查它是否正常工作。
[email protected]:~# ufw status
Status: active
To Action From
-- ------ ----
7687/tcp ALLOW 192.168.50.189
[email protected]:~#
有了这个,我们就有了一个可以运行的 Neo4j 服务器,它可以运行并配置为允许访问端口 7687。
结论
我们会见了 Neo4j 图形数据库,了解了它的工作原理以及为什么需要它。 设置包管理器,然后安装 Neo4j。 接下来,我们检查了功能,进入并更改了密码。 我们尝试了有关如何创建表、建立关系和设置节点的基本命令。 最后,我们配置了与所需 IP 的连接并配置了防火墙以确保安全。
[ad_2]