首页 > 数据库 > > Neo4j | 数据导入

当我们在create创建语句导入数据时,因为这样的数据导入是在Neo4j事物处理框架内执行的,如果对大量数据进行操作时,需要根据具体情况选择导入方式。如果大批量初始化,则用Neo4j-import自带的高性能导入工具;增量数据的同步加载又不想暂停数据库服务,那就要用load csv,也是Neo4j自带的导入工具;如果可以忍受服务器的短暂关闭,可以用batch-import方式。
一般情况下会很少使用create语句的方式去导入数据,create除了比较麻烦之外还比较耗费系统的资源,且在写入时是一条数据一条数据的方式进行写入,所以效率方面异常的慢,这里就不做太多的介绍(可参考官方方法,官方文档见文章末尾链接)。
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});通常我们在导入数据之前可以创建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
官方事例导入关系数据语法:
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的原项目地址为:链接,此工具是在neo4j自带批量导入工具基础上的进一步优化,在使用内存和增量导入上做了优化。
环境准备:jdk7以上java环境,maven环境,java项目IDE工具(IDEA),Neo4j版本3.1.1以下版本。

具体的节点文件格式为:
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:06Sh Import.sh XXX.db node.cvs rel.csv
其中db是图数据库的db文件夹。再导入过程中需要注意neo4j的版本不能太高,目前此工具支持到最高版本的neo4j是3.1.1所以这里要注意一下。
具体方法可以参见Neo4j的官网,这里就不做赘述。
首先需要安装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()验证是否安装成功

接下来就可以使用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工具。
参考文档:
Awesome Procedures On Cypher来自
Efficient Graph Algorithms for Neo4j
Batch-import导入数据:
https://my.oschina.net/u/2538940/blog/883829
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69918097/viewspace-3145904/ ,如需转载,请注明出处,否则将追究法律责任。