我通过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个请求,这需要很长时间。 有没有办法更快地完成它?
答案 0 :(得分:1)
您还应考虑其他两个选项:import tool和LOAD CSV选项。
这里正确的问题是&#34;如何快速将数据放入neo4j&#34;而不是&#34;如何快速执行大量的CREATE语句&#34;。这两个选项都比单个CREATE
语句更快,所以我不会再混淆单个CREATE
。
LOAD CSV
选项将完全按照名称提示。您基本上使用密码查询语言直接从文件加载数据,并且它会大大加快,因为您在&#34;批次&#34;中提交记录。 (文档描述了这一点)。因此,您仍然使用交易来获取数据,您只需更快地批量执行此操作,并且能够在此过程中创建复杂的关系。
导入工具类似,只是它具有非常高的性能,可以创建大量数据。这里的魔力(以及为什么它如此之快)是它跳过事务层。这既是好事也是坏事,取决于你的观点(迈克尔·亨格的博客文章,我相信解释权衡)。
在不知道您的数据的情况下,很难做出具体的推荐 - 但作为一般性,我会先说LOAD CSV
作为默认值,然后转到导入工具,如果和只有当数据量非常大,或者您的插入性能要求非常高时。这反映了我对交易是一件好事的轻微偏见,并且保留在密码层(而不是使用单独的命令行工具)也是一件好事,但是YMMV。