中文开放知识图谱含有大量开放的知识图谱数据,可以做实验研究使用. 该平台上的提交的数据格式各种各样, 所以一般下载了平台开放数据都要做一些简单的ETL操作,将原始数据转换为(entity, entity, relation) 这样的三元组,方便直接导入Neo4j 实例. 部分开放数据集数据量比较大,常规方法可能会导致导入速度慢, 本文探讨如何将大量数据快速导入Neo4j实例.
Neo4j 3.5.9版本, python 3.7, python neo4j driver 4.2.1
Neo4j 本身提供了一种从CSV文件导入数据的方法, 而且方法本身效率也比较高.
语法结构:
USING PERIODIC COMMIT 100
LOAD CSV FROM "file:///XXXX.csv" AS line
MERGE XXXX
第一句话代表使用周期性自动提交, 此处是每100 条提交一次.
第二句指定导入CSV文件名称, 此CSV文件本地导入必须放在/var/lib/neo4j/import
目录下, 远程资源导入必须提供URI.
第三行开始就是创建节点与关系的Cypher语句了, 避免重复创建节点,可以使用MERGE
代替CREATE
.
创建节点
USING PERIODIC COMMIT 100
LOAD CSV FROM "file:///node.csv" AS line
CREATE (p: Node{id: line[0]}
创建关系
USING PERIODIC COMMIT 100
LOAD CSV FROM "file:///relationship.csv" AS line
MATCH (p:node{id: line[0]}), (q:node{id: line[1]})
CREATE (p)-[:关系]->(q)
此种方法在创建节点的时候速度还行,但是当构建关系的时候效率明显变慢,主要原因还是在MATCH
这一行查询指定节点的语句上面. 因此如果本身数据集合关系比较少还是推荐使用此方法导入, 如果节点关系比较复杂,还是用下面的方法导入.
neo4j 官方提供了 import 方法实现导入, 要求原始数据是规范的csv文件. 此种方法本质上是使用工具直接生成数据库磁盘文件, 所以它没有语句解析,执行等正常的Cypher语句过程,自然效率就比较高.
官方说明:neo4j admin import
注意点就是ID列需要全局唯一性, 即便是不同类型的节点也需要全局唯一.其次是导入时注意语法
neo4j-admin import --database graph.db \
--nodes "./a_header.csv,./a.csv" \
--nodes "./b_header.csv,./b.csv" \
--nodes "./c_header.csv,./c.csv" \
--relationships "./a2b_header.csv,./a2b.csv" \
--relationships "./b2c_header.csv,./b2c.csv" \
--relationships "./c2a_header.csv,./c2a.csv" \
--ignore-missing-nodes=true
一个 --nodes
参数对应一类节点的header 和 data 不要把两种节点放一个 --nodes
参数里面, 不然第二类节点的header数据会被当做真实数据, 笔者踩过坑. 所以按照如上的语句导入header和data文件不会出现任何问题.