快速执行多个CREATE语句的方法

时间:2015-05-29 14:07:31

标签: java neo4j cypher

我通过Java访问neo4J数据库,我想创建1,300万个节点。因此,我创建了1,300万“CREATE”语句。正如我所知,查询太长了。我只能为每个查询执行~100个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,300万个查询而我只能将100个结合到一个请求中,我仍然需要13,000个请求,这需要很长时间。 有没有办法更快地完成它?

1 个答案:

答案 0 :(得分:1)

您还应考虑其他两个选项:import toolLOAD CSV选项。

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

迈克尔·亨格写了great blog post描述了将数据导入neo4j的多个方面,你应该看看你是否想要了解更多为什么这些是好的选择,而不仅仅是它们是好的选择。

LOAD CSV选项将完全按照名称提示。您基本上使用密码查询语言直接从文件加载数据,并且它会大大加快,因为您在&#34;批次&#34;中提交记录。 (文档描述了这一点)。因此,您仍然使用交易来获取数据,您只需更快地批量执行此操作,并且能够在此过程中创建复杂的关系。

导入工具类似,只是它具有非常高的性能,可以创建大量数据。这里的魔力(以及为什么它如此之快)是它跳过事务层。这既是好事也是坏事,取决于你的观点(迈克尔·亨格的博客文章,我相信解释权衡)。

在不知道您的数据的情况下,很难做出具体的推荐 - 但作为一般性,我会先说LOAD CSV作为默认值,然后转到导入工具,如果和只有当数据量非常大,或者您的插入性能要求非常高时。这反映了我对交易是一件好事的轻微偏见,并且保留在密码层(而不是使用单独的命令行工具)也是一件好事,但是YMMV。