快速导入大量数据到Neo4j实例实现.

本文探讨如何高效地将大量数据导入Neo4j知识图谱。介绍了使用LOADCSV方法和neo4jadminimport工具的优缺点。LOADCSV适合节点关系较少的情况,而neo4jadminimport由于直接生成数据库文件,导入速度更快,适用于节点关系复杂的大型数据集。在使用neo4jadminimport时需注意ID的全局唯一性和正确的命令格式。
摘要由CSDN通过智能技术生成

背景

中文开放知识图谱含有大量开放的知识图谱数据,可以做实验研究使用. 该平台上的提交的数据格式各种各样, 所以一般下载了平台开放数据都要做一些简单的ETL操作,将原始数据转换为(entity, entity, relation) 这样的三元组,方便直接导入Neo4j 实例. 部分开放数据集数据量比较大,常规方法可能会导致导入速度慢, 本文探讨如何将大量数据快速导入Neo4j实例.

依赖

Neo4j 3.5.9版本, python 3.7, python neo4j driver 4.2.1

数据分析

方法1: LOAD CSV

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 这一行查询指定节点的语句上面. 因此如果本身数据集合关系比较少还是推荐使用此方法导入, 如果节点关系比较复杂,还是用下面的方法导入.

方法2: neo4j admin import

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文件不会出现任何问题.

这段代码是一个 Neo4j 的配置类,其中使用了 Spring Data Neo4j 库提供的注解 @EnableNeo4jRepositories 和 @EnableTransactionManagement 来启用 Neo4j 的 Repository 和事务管理功能。具体解释如下: - @Configuration:声明该类为 Spring 配置类。 - @EnableNeo4jRepositories:启用 Spring Data Neo4j 库中的 Repository 功能。其中 sessionFactoryRef 属性指定了该配置类中的 neo4jSessionFactory() 方法返回的 SessionFactory 实例作为 Neo4j 的操作会话工厂,transactionManagerRef 属性指定了该配置类中的 neo4jTransactionManager() 方法返回的 Neo4jTransactionManager 实例作为事务管理器,basePackages 属性指定了 Repository 接口所在的包名。 - @EnableTransactionManagement:启用 Spring 的事务管理功能。 - neo4jSessionFactory() 方法返回一个 SessionFactory 实例,用于创建 Neo4j 的操作会话对象。其中通过指定 "com.study.neo4j.bean" 包名来扫描领域实体类。 - configuration() 方法返回一个 org.neo4j.ogm.config.Configuration 实例,用于配置 Neo4j 的连接信息和映射规则。其中通过 ClasspathConfigurationSource 类加载了一个名为 "neo4j.properties" 的配置文件,该文件中定义了 Neo4j 的连接信息和映射规则。 - neo4jTransactionManager() 方法返回一个 Neo4jTransactionManager 实例,用于将 Neo4j 的操作会话对象和 Spring 的事务管理器整合起来,从而支持 Neo4j 的事务管理功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值