如何在 Ubuntu 20.04 上安装 Neo4j

介绍

在本教程中,我们将研究 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 的连接,并配置了防火墙以确保安全。