绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Neo4j | 数据导入
2020-05-21 14:13:15

Neo4j导入数据有几种方式:

  1. Cypher creater语句,既通过语句创建导入,同insert一样,每一条数据写一个create
  2. Cypher load csv语句,将数据转成CSV格式,通过LOAD CSV读取数据
  3. 官方提供的neo4j-import工具,现在被neo4j-admin import代替
  4. 大牛编写的 batch-import 工具
  5. neo4j-apocload.csv +apoc.load.relationship
几种导入数据方式性能对比

关于Neo4j导入数据的问题?

当我们在create创建语句导入数据时,因为这样的数据导入是在Neo4j事物处理框架内执行的,如果对大量数据进行操作时,需要根据具体情况选择导入方式。如果大批量初始化,则用Neo4j-import自带的高性能导入工具;增量数据的同步加载又不想暂停数据库服务,那就要用load csv,也是Neo4j自带的导入工具;如果可以忍受服务器的短暂关闭,可以用batch-import方式。

Create语句

一般情况下会很少使用create语句的方式去导入数据,create除了比较麻烦之外还比较耗费系统的资源,且在写入时是一条数据一条数据的方式进行写入,所以效率方面异常的慢,这里就不做太多的介绍(可参考官方方法,官方文档见文章末尾链接)。

Load csv方式【链接

Load CSV也是Neo4j官方给出的一种导入数据的工具,适合中小型数据量的导入,大概千万级别,官网给出的事例方法:

USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM "file:customers.csv" AS row CREATE (:Customer {companyName: row.CompanyName, customerID: row.CustomerID, fax: row.Fax, phone: row.Phone});
  1. 导入之前可以先建立索引

通常我们在导入数据之前可以创建INDEX,能够适当的提高导入效率。

事例语句:
CREATE INDEX ON :Product(productID);
实际建立索引过程:
CREATE INDEX ON :phone(phone_no)

导入我们事先准备好的详单通话数据,数据可以放在neo4j目录下的import文件夹下。

具体本地neo4j的导入语法为:

USING PERIODIC COMMIT 100000 LOAD CSV WITH HEADERS FROM "file:///neo4j_phone.csv" AS row CREATE (:phone {phone_no: row.pnone_no});

这里的CREATE也可以换成MERGE,使用MERGE时可以避免导入的数据重复,这里还需要注意一个点为,如果我们的CSV文件的行是列名,就可以用以上语法with herders来确认行的列名,如果行直接就为需要导入的数据,则需要对语法进行简单的修改。

USING PERIODIC COMMIT 100000 LOAD CSV FROM "file:///neo4j_phone.csv" AS row CREATE (:phone {phone_no: row[0]});

以上18万的节点(节点不带任何的属性)花费时间为5384MS,5.3秒,平均3W/S

  1. 接下来我们导入节点之间的关系数据,关系数据同节点数据都在同一个文件夹下

官方事例导入关系数据语法:

USING PERIODIC COMMITLOAD CSV WITH HEADERS FROM "file:orders.csv" AS rowMATCH (order:Order {orderID: row.OrderID}) MATCH (product:Product {productID: row.ProductID}) MERGE (order)-[pu:PRODUCT]->(product)ON CREATE SET pu.unitPrice = toFloat(row.UnitPrice), pu.quantity = toFloat(row.Quantity);

实际操作过程中导入语法为:

USING PERIODIC COMMIT 100000 LOAD CSV WITH HEADERS FROM "file:///neo4j_relationship.csv" AS row MATCH (from:phone{phone_no: row.mobile}),(to:phone{phone_no: row.another_nm}) MERGE (from)-[c:call{call_count:row.call_count,comm_time_sum:row.comm_time_sum,start_time_min:row.start_time_min,start_time_max:row.start_time_max}]->(to)

同样的,如果文件开头带有列名可以按照以上方式导入,如果文件开头直接为数据,可参考以下语法进行导入。

USING PERIODIC COMMIT 100000 LOAD CSV FROM "file:///neo4j_relationship.csv" AS row MATCH (from:phone{phone_no: row[0]}),(to:phone{phone_no: row[1]}) MERGE (from)-[c:call{call_count:row[2],comm_time_sum:row[3],start_time_min:row[4],start_time_max:row[5]}]->(to)

created 206813 relationships, completed after 20368 ms。创建20万条边共花费20秒,性能在1W/s。

总结:对于LOAD CSV工具,性能上表现中规中矩,不算快也不算很慢,对于处理中小型数据量的数据有优势,不用停机可实时导入,利用MERGE可以防止重复数据的导入,在做每日增量数据的导入时是一个不错的方案,还需要注意的是,在commit提交数据的过程中可以限制1W或者10W提交一次,以防对内存的消耗过大或占用太多资源而影响到库的其他服务。

Batch-import方式

Batch-import的原项目地址为:链接,此工具是在neo4j自带批量导入工具基础上的进一步优化,在使用内存和增量导入上做了优化。

环境准备:jdk7以上java环境,maven环境,java项目IDE工具(IDEA),Neo4j版本3.1.1以下版本。

  1. 从github上down下代码,用maven进行打包,将打完包的jar文件与项目本身以来的jar一起放在lib文件夹下。
  2. 对项目目录中的Importer对象进行打包。将打包完成的jar包和项目本身以来jar一起放在lib文件夹下,或者也可以将所有jar打包成一个大的jar包,batch.properties文件和执行导入的脚本放在lib同级目录下,具体如下:



  1. 组装CSV文件,节点csv文件的列是固定的,列值为此节点的label名称,第二列为index,它的列头为id:string:indexName格式,id为列名可以自己定义,string为数据类型,indexName是Neo4j数据库所要导入的索引名称。

具体的节点文件格式为:

l:label,phone_no:String:phoneID
phone,18768883717

关系csv文件需要注意的是列是关系的起始节点,第二列是关系的结束节点,第三列是关系类型,后面的就是关系的属性,只需要注意前三列就可以了。

:string:phoneID,:string:phone_to,call_count:int,comm_time_sum:int,start_time_min:string,start_time_max:string
13141285294,4008200588,5.0,11.716666666666669,2016-06-26 12:56:39,2016-07-10 12:05:14
13141285294,13811495517,1.0,1.6666666666666663,2016-06-21 12:06:06,2016-06-21 12:06:06
  1. 修改batch.properties文件,主要修改两个地方,如果在现有的库中导入,batch_import.keep_db=true,将节点csv文件中的所有索引名称加入到文件中,比如上面的phoneID,那就在文件中加入batch_import.node_index.buyerId=exact。
  2. 导入,import.bat和import.sh都可以进行导入执行命令:

Sh Import.sh XXX.db node.cvs rel.csv

其中db是图数据库的db文件夹。再导入过程中需要注意neo4j的版本不能太高,目前此工具支持到高版本的neo4j是3.1.1所以这里要注意一下。

import方式导入

具体方法可以参见Neo4j的官网,这里就不做赘述。

Apoc方式

首先需要安装apoc,具体安装可以下载apoc-all的jar包,将jar包放在neo4j安装目录的installation-3.5.0\plugins文件夹下,另外在conf文件夹下的conf文件中加入以下内容:

#apoc配置内容
dbms.security.procedures.unrestricted=apoc.*
apoc.import.file.enabled=true
apoc.export.file.enabled=true

重启neo4j服务即可,界面运行return apoc.version()验证是否安装成功


return apoc.version()

接下来就可以使用apoc进行数据的导入,语法上和load csv没有太大的区别,并且apoc还带有其他的一些功能可以使用:

Load csv from “filepath” as line filedterminator ‘,’ Merge (n1:phone {phone_no:line[0]}) Merge (n2:phone {phone_no:line[1]}) With n1, n2 line Call apoc.create.relationship(n1, line[2], {}, n2) yield rel Return count(rel);

后续会有单独的一章介绍apoc工具。

参考文档:

Neo4j处理速度为什么这么慢?

Neo4j批量导入数据的几种方式

Csv文件导入Neo4j

Neo4j官网

Awesome Procedures On Cypher来自

Efficient Graph Algorithms for Neo4j

Batch-import导入数据:

my.oschina.net/u/253894

github.com/mo9527/batch

database.51cto.com/art/

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Neo4j 图形数据库
创建时间:2020-05-19 17:48:05
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。 Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注.
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • ?
    专家
戳我,来吐槽~