Neo4j系列博客-入门

Neo4j 安装

Neo4j 数据库支持安装部署的操作系统非常广泛,如 WindowsMacCentOSUbuntu 等操作系统均可安装。

其中可以访问 Neo4j 官方网站 ,找到下载链接,然后下载对应的版本。

Mac

Mac 系统自带的 brew 包管理器中可以直接安装 Neo4j

1
brew install neo4j

运行 neo4j

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ neo4j start/stop/restart
Directories in use:
home: /usr/local/Cellar/neo4j/4.4.2/libexec
config: /usr/local/Cellar/neo4j/4.4.2/libexec/conf
logs: /usr/local/var/log/neo4j
plugins: /usr/local/Cellar/neo4j/4.4.2/libexec/plugins
import: /usr/local/Cellar/neo4j/4.4.2/libexec/import
data: /usr/local/var/neo4j/data
certificates: /usr/local/Cellar/neo4j/4.4.2/libexec/certificates
licenses: /usr/local/Cellar/neo4j/4.4.2/libexec/licenses
run: /usr/local/Cellar/neo4j/4.4.2/libexec/run
Starting Neo4j.
Started neo4j (pid:64455). It is available at http://localhost:7474
There may be a short delay until the server is ready.

之后即可以在本地访问 http://localhost:7474 来进行下一步的操作。

Windows

Neo4j 官方网站下载对应的安装包后双击即可安装。

在安装完成后,首先需要使用管理员身份启动命令行工具,然后导航到 Neo4j 的安装目录下,运行相关的指令即可(指令都是一样的)。

Ubuntu

下载操作系统对应的安装包后,在命令行下将 tar 文件进行解压。
然后修改 conf/neo4j-server.properties 配置文件,将 org.neo4j.server.webserver.address=0.0.0.0 注释字符去掉。
最后,进入到 bin 目录下,运行 Neo4j 指令启动数据库即可。


基本元素及概念

节点(Node

节点是图数据库中的一个基本元素,用以表示一个实体记录,就像关系数据库中的一条记录一样,在 Neo4j 中节点可以包含多个属性(Property)和多个标签(Label)。
neo4j-5.jpg

关系(Relationship)

关系同样是图数据中的基本元素。当数据中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图的边(Edge),其始端和末端都必须是节点,关系不能指向空也不能由空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type)。
neo4j-5.jpg
neo4j-6.jpg

一个节点可以被多个关系指向或作为关系的起始节点。
neo4j-7.jpg

关系必须要开始节点(Start node)和结束节点(End node),两头不能为空。
节点可以被串联或并联起来。由于关系是可以有方向的,所以可以在由节点、关系组成的图中进行遍历操作。
neo4j-8.jpg

在图的遍历操作中我们可以指定关系遍历的方向或者指定为无方向的,因此在创建关系时不必为两个节点创建相互指向的关系,而是在遍历时不指定遍历方向即可。
特别需要注意的是一个节点存在指向自己的关系。
neo4j-9.jpg

属性(Property

节点和关系都可以有多个属性。属性由键值对组成,属性名类似于变量名,属性值类似于变量值。属性值可以是基本的数据类型,或者由基本数据组成的数组。
属性值没有 null 的概念,如果一个属性值不需要了,可以将整个键值对都移除,在使用 Cypher 或者 Java API 时可以用 IS NULL 关键字来判断属性是否存在。

路径

当使用节点和关系创建了一个图之后,在此图中任意选择两个节点都是可能存在路径的。
图中任意节点都存在由节点和关系组成的路径,路径也有长度的概念,也就是路径中的关系数。当然也可以说单独一个节点就可以组成长度为 0 的路径。
neo4j-10.jpg

如果是两个简单的节点,中间只存在一个关系,那这条路径的长度就是 1

遍历(Traversal

遍历一张图就是按照一定的规则,根据他们之间的关系,依次访问所有的相关联的节点的操作。

遍历规则可以是广度优先也可以是深度优先。


批量工具使用

目前,导入到 Neo4j 的工具有两种:

  • load csv 指令
  • neo4j-import 工具

这两种都是基于 CSV 文件的,既然需要 CSV 文件,那么我们就需要考虑一下如何从其他数据库中获取 CSV 文件。

获取 CSV 文件

SQL Server
  1. 打开一个查询窗口,输入 SQL 语句查询出需要导出的数据列表。
  2. 在查询出来的结果中,复制所有查询出来的数据。然后右键选择“将结果另存为”。
  3. 之后就可以选择保存为 CSV 文件,之后用 Excel 打开文件就是对应的内容了。
MySQL

MySQL 支持将查询结果直接导出为 CSV 文本格式,在使用 select 语句查询数据时,在语句后面加上导出指令即可,格式如下:

  • into outfile: 指定导出的目录和文件名。
  • fields terminated by: 定义字段间的分隔符。
  • optionally enclosed by: 定义包围字段的字符(数值型字段无效)。
  • lines terminated by: 定义每行的分隔符。
1
select * from mytable where mytag like 'E1%' into outfile 'E:/E1.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n'; 

此条语句执行后,会讲表中匹配到的数据导出到 E1.csv 文件中。其中每个字段以逗号分隔,字段内容是以双引号包围的字符串,每条记录使用 \r\n 换行。

Oracle

可以使用 sqlplus 导出 CSV 文件,这是一种很方便的方式。

首先需要创建 sqlplus.sql 文件,内容如下:

1
2
3
4
5
6
7
8
set colsep ,
set feddback off
set heading off
set trimout on
spool E:\user.csv
select '"' || user_name || '","' || user_age || '","' || user_card || '","' || user_sex || '","' || user_address || '","' || user_tel || '","' || '"' from user_b1;
spool off
exit

然后运行 sqlplus 命令:

1
sqlplus -s user_naem/passwd@db @spool.sql

这样就从 Oracle 中将表中的数据导出到 user.csv 文件中。

CSV 内容格式注意事项

CSV 文件内容格式常见错误如下:

  • CSV 文件开始之处存在 BOM 字节顺序标记(两个 UTF-8 字符),如果存在需要删除他们。
  • 文件内存在非文本类型的字符,如果存在则删除他们。
  • 存在不规则换行符。如混用 WindowsUNIX 换行符,如果需要请确保他们一致,最好选择 UNIX 风格。
  • CSV 文件头与数据不一致,如此情况需要修复头部。
  • 带引号和不带引号的文本字段中出现换行符,如存在就删除换行符。
  • 存在杂散的引号,非文本中存在独立双引号或单引号,如存在就转义或删除杂散引号。

使用 Load CSV 指令导入文件

Neo4j 提供了 Load CSV 命令帮助我们将 CSV 数据文件导入到 Neo4j 中。

简单导入数据

Load CSV 读取但不存入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 查看前 CSV 文件行数
LOAD CSV FROM "file-url" AS line
RETURN count(*);

// 查看前 CSV 文件前 5 行
LOAD CSV FROM "file-url" AS line WITH line
RETURN line
LIMIT 5;

// 查看前 CSV 文件,并带有头部数据
LOAD CSV WITH HEADERS FROM "file-url" AS line WITH line
RETURN line
LIMIT 5;

其中 file-url 是文件的地址,可以是本地地址也可以是网址,只要能地址中读出 CSV 文件即可。
对于 RETURN 语句,是用来返回并显示结果到结果显示区的语句。
对于 LIMIT 语句,用来限制返回的行数。

要导入文件到 Neo4j 数据库中需要使用相应的 Create 语句。

1
2
LOAD CSV FROM "file-url" AS line
CREATE (:Movie { title: line[0], released: line[1], tag: line[2] })

执行完上述语句,就能在结果显示区看到创建节点的数量。

接着使用以下语句查看数据库是否已经有导入的数据:

1
MATCH (n:Movie) RETURN n

此时结果就会在结果展示区展示。

导入 CSV 时附带表头

下面介绍导入 CSV 时附带上表头:

1
2
LOAD CSV WITH HEADERS FROM "file-url" AS line
CREATE (:Track { TrackId: line.Id, Name: line.Name, Length: line.Length } )

上述语句使用 WITH HEADERS 子句,它的功能在于导入 CSV 时附带上头部,头部由 line.Idline.Name 制定。

1
MATCH (n:Track) RETURN n

在结果展示区就可以看到每个元素都带有 TrackIdNameLength 头部元素。

导入 CSV 大文件

如果要导入包含大量数据的 CSV 文件,则可以使用 PERODIC COMMIT 子句。
使用 PERODIC COMMIT 指示 Neo4j 在执行完一定行数后提交数据再继续,这样减少了内存开销。
使用 PERODIC COMMIT 默认值为 1000 行,因此数据将每一千行提交一次。
要使用 PERODIC COMMIT,只需在 LOAD CSV 语句之前插入 USING PERODIC COMMIT 语句。

具体使用方法如下:

1
2
3
USING PERODIC COMMIT [line_num]
LOAD CSV WITH HEADERS FROM "file-url" AS line
CREATE (:Track { TrackId: line.Id, Name: line.Name, Length: line.Length } )

使用 neo4j-import 工具导入文件

Neo4j 2.2 版本开始,系统自带的一个大数据量的导入工具: eno4j-import,可支持并行、可扩展的大规模 CSV 数据导入。

使用示例:

1
2
3
4
5
bin/neo4j-import --into retail.db --id-type string \
--nodes:Customer customers.csv --nodes products.csv \
--nodes:orders_header.csv,orders1.csv,orders2.csv \
--relationships:CONTAINS order_details.csv \
--relationships:ORDERED customer_orders_header.csv,orders1.csv,orders2.csv

上述中 --into 子句指明了导入的 Neo4j 数据库名称;--id-type 子句指明了生成节点、关系的主键类型为 string 类型;--nodes: 子句开头的 CSV 文件是节点 csv 文件;--relationships: 开头的是关系 CSV 文件。


引用


个人备注

此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!