【知识图谱】Neo4j 导入数据构建知识图谱的三种方法

目录

Neo4j数据导入5种方式

1、使用Cypher语言创建

1.1 创建节点【create】

1.2 修改节点的属性

1.3 创建带属性值的节点

1.4 创建节点间的关系

1.5 其他操作命令

1.6 cypher查询语言的使用规律

2、使用load csv导入数据

2.1 构建容器(非必须)

2.2 导入节点csv文件

2.3 创建索引并删除重复节点

2.4 导入关系csv文件

3、使用neo4j-admin导入数据

3.1 数据导入前的准备工作

3.2 数据预处理

3.3 数据导入

3.4 查看知识图谱

4、总结


Neo4j数据导入5种方式

neo4j的数据导入方式有很多,总结起来总共分为以下5种:

  1. Cypher CREATE 语句,为每一条数据写一个CREATE
  2. Cypher LOAD CSV 语句,将数据转成CSV格式,通过LOAD CSV读取数据。
  3. 官方提供的Java API —— Batch Inserter
  4. 大牛编写的 Batch Import 工具
  5. 官方提供的 neo4j-import 工具

物种方式的优缺点对比:

1、使用Cypher语言创建

1.1 创建节点【create】

第一种方式:  merge(n:洛杉矶湖人)     # 节点不存在,则创建,存在,则忽略。

第二种方式:  create(n:洛杉矶湖人)     # 不管节点存不存在,创建

效果就是,洛杉矶湖人这类的节点,一共被创建了两次,因此,查询的时候,会出现两个Node。虽然上面我们创建了两个节点,但是这两个节点除了系统给的唯一id外,没有其他属性,下面我就基于这两个节点,分别对它们进行“update”,赋予节点意义。

1.2 修改节点的属性

首先:查询ID等于21798的Node

其次:给该Node添加三个属性,分别是label(节点标签名),height(身高),position(场上位置)

neo4j查询节点用:match   == 相当于关系型数据库的select,相当于非关系数据库mongodb的find

neo4j修改节点属性用:set == 相当于关系型数据库的update…set…

类似sql语句: update n set label = ‘科比’,height=198,position=’得分后卫’ where id = 21798

区别:关系型数据库如果字段不存在的话会 错,而NoSql数据库neo4j,如果属性字段不存在的话,就添加

执行后,效果如下:

1.3 创建带属性值的节点

我们使用create创建另一位湖人传奇巨星奥尼尔这个节点,语句如下:

效果如下:

1.4 创建节点间的关系

构成一条关系最基本的要素是要有两个对象,放在neo4j图库中就是,两个节点,一条边,才能称作是一个完整的关系。创建统一用create命令,而关系的创建,实际上和创建节点差不多,唯一区别就是,关系是有方向的,而且关系用‘[]’表示,而节点用’()’表示。

下面我给目前尚存在的两个节点,科比和奥尼尔创建一条关系,关系的name叫“搭档”,这种关系,不区分方向,因此,无所谓谁是startNode,谁是endNode。

解释一下:

1、首先匹配找到节点n和b,也就是科比和奥尼尔代表的节点Node;

2、然后创建节点n到节点b的关系r,r有三个属性,一个是从哪一年开始since,一个是关系描述des,另一个是合作拿过的冠军数量champion;

3、最后返回n,r,b 完整节点之间的关系结果,table数据如下,总过三列:
 

最终,创建的graph图效果如下:

1.5 其他操作命令

如果要修改关系的属性,和修改节点的属性一样,修改关系的属性也用set,如修改id等于12513的关系的属性des为“小飞侠&大鲨鱼”的语句如下:

如果要删除节点间的关系,删除统一用命令delete,和删除节点一样,删除关系的语句如下:

如果要查询科比和奥尼尔之间的关系,则语句如下:

如果要创建索引,语法:

为节点标签洛杉矶湖人基于属性label创建索引,语句如下:

删除索引:

1.6 cypher查询语言的使用规律

其实使用cypher语言来查询还是非常简单的,因为不管你查什么,查的无外乎节点、关系、节点间的关系,用表达式表示就是:(n)-[r]-(b),掌握以下规律,你就可以快速掌握如何使用Cypher语言。

结合表达式:  match(n)-[r] -(b)

      如果查询节点n                            就    return n

      如果查询关系r                             就    return r

      如果查询节点b                            就    return b

      如果查询节点n和b之间的关系r    就    return n,r,b

      如果查询带条件                          就    where n.x = x,r.xx = xx,b.xxx = xxx

      如果修改属性                             就     where…..   set ….

      如果删除属性                             就     where…..   remove …..

      如果删除节点或关系                   就     where…..   delete n 或者 delete r  或者 delete b 或者 delete n , r , b

 

2、使用load csv导入数据

2.1 构建容器(非必须)

docker环境下安装:这里说明下,默认将容器的/data,/var/lib/neo4j/import目录映射到宿主机。/data存储的是数据,/var/lib/neo4j/import存储的是你想要导入数据的

初次进行大批量数据的导入有很多方式,但是每种方式都会有自己的局限性。这里是官 文档。

2.2 导入节点csv文件

通过cypher-shell命令行直接导入数据。这样的方式,可以不停用neo4j服务,直接导入到库中。

USING PERIODIC COMMIT 1000,是满足1000条之后,提交一个事务,这样能够提高效率。

2.3 创建索引并删除重复节点

导入节点之后,我们必然会导入关系。这里就有个坑,如果你在node节点的库里,没有创建index,那么导入关系的时候,将会慢的要死。

2.4 导入关系csv文件

3、使用neo4j-admin导入数据

通过neo4j-admin方式导入的话,需要暂停服务,并且需要清除graph.db,这样才能导入进去数据。而且,只能在初始化数据时,导入一次之后,就不能再次导入了。所以这种方式,可以在初次建库的时候,导入大批量数据,等以后如果还需要导入数据时,可以采用上边的方法。

3.1 数据导入前的准备工作

对于大规模的数据集,使用语句插入和load csv的时候往往非常缓慢,当需要插入大量三元组时,可以考虑使用Neo4j-import的方式。这种方式有许多注意点

3.2 数据预处理

neo4j-import官方要求的数据格式为csv文件,主要就是分成两个文件entity.csv 和relationship.csv。

其中entity.csv中包含了实体的id,实体的name,以及标签LABEL,具体格式如下:

relationship.csv文件包含了起始节点id,结束节点id,关系的name,以及标签LABEL,具体格式如下:

需要将导入的数据转换成这样的两个格式的csv文件,才能够导入Neo4j中。

3.3 数据导入

csv数据文件准备好后,可以通过执行以下脚本来实现数据导入:


  1. #导入命令
  2. # 停止neo4j服务
  3. neo4j stop
  4. # 如果是Linux可以进入到databases目录下删除数据库,windows直接删除即可
  5. cd /usr/local/Cellar/neo4j/3.5.0/libexec/data/databases
  6. rm -rf graph.db
  7. # 执行数据导入命令neo4j-admin
  8. neo4j-admin import
  9. 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年9月26日
下一篇 2019年9月26日

相关推荐