2015-05-29 77 views
2

我通过Java访问neo4J数据库,我想创建1,300万个节点。因此我创建了1,300万个“CREATE”语句。正如我所知道的那样,查询太长了。我只可以执行〜100 CREATE每个查询语句 - 否则查询失败:快速执行多个CREATE语句的方法

Client client; 
WebResource cypher; 
String request; 
ClientResponse cypherResponse; 
String query = ""; 
int nrQueries = 0; 

for(HashMap<String, String> entity : entities){ 
    nrQueries++; 
    query += " CREATE [...] "; 

    if(nrQueries%100==0){ 
     client = Client.create(); 
     cypher = client.resource(SERVER_ROOT_URI + "cypher"); 
     request = "{\"query\":\""+query+"\"}"; 
     cypherResponse = cypher.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, request); 
     cypherResponse.close(); 
     query = ""; 
    } 
} 

嗯,我想执行1,3万次查询,我只能联合收割机100成一个请求,我仍然有13000个请求,这需要很长时间。 有没有办法更快地做到这一点?

回答

1

您应该考虑另外两个选项:import toolLOAD CSV选项。

这里的正确问题是“如何快速将数据放入neo4j”而不是“如何快速执行大量CREATE语句”。这两个选项都会比单独的CREATE陈述更快,所以我不会再混淆个人CREATE了。

Michael Hunger写了一个great blog post描述了将数据导入neo4j的多个方面,你应该看看你是否想更多地理解为什么这些是好的选择,而不仅仅是它们是好的选择。

LOAD CSV选项将完全按照名称的建议进行。你将基本上使用密码查询语言直接从文件加载数据,并且由于你在“批处理”(文档描述了这一点)中提交了记录,所以它实质上更快。因此,您仍然在使用事务处理来获取数据,您只需更快速地批量处理数据,并且可以一路创建复杂的关系。

导入工具是相似的,除非它是为高性能创建大量数据。这里的魔力(以及它为什么如此之快)是因为它跳过了事务处理层。这既是好事也是坏事,取决于你的观点(Michael Hunger的博客文章我相信解释了这种权衡)。

不知道你的数据很难提出具体的建议 - 但作为一个普遍性,我认为从LOAD CSV开始作为默认值,并且当且仅当数据量非常大时才转移到导入工具,或者您的插入性能要求非常高。这反映了我的观点略有偏差,即交易是一件好事,而停留在密码层(而不是使用单独的命令行工具)也是一件好事,但是YMMV。