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

标签 java neo4j cypher

我通过 Java 访问一个 neo4J 数据库,我想创建 130 万个节点。因此,我创建了 130 万个“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 = "";
    }
}

好吧,因为我要执行 130 万个查询,而我只能将 100 个合并为一个请求,所以我还有 13,000 个请求,这需要很长时间。 有没有更快的方法?

最佳答案

您还有两个应该考虑的选项:import toolLOAD CSV选项。

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

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

LOAD CSV 选项将完全按照名称的含义进行操作。您基本上会使用密码查询语言直接从文件中加载数据,而且速度要快得多,因为您“分批”提交记录(文档对此进行了描述)。因此,您仍在使用事务来获取数据,只是速度更快、分批处理,同时能够在此过程中创建复杂的关系。

导入工具类似,不同之处在于它用于非常高性能地创建大量数据。这里的神奇之处(以及为什么这么快)是它跳过了事务层。这既是好事也是坏事,具体取决于您的观点(我相信 Michael Hunger 的博客文章解释了权衡)。

在不了解您的数据的情况下,很难提出具体的建议 - 但一般来说,我会说默认使用 LOAD CSV 开始,当且仅当数据量真的很大,或者你的插入性能要求非常高。这反射(reflect)了我的轻微偏见,即事务是一件好事,留在密码层(而不是使用单独的命令行工具)也是一件好事,但是 YMMV。

关于java - 快速执行多个 CREATE 语句的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30531731/

相关文章:

java - Oracle Coherence 的 POF 与 Java 序列化

java - checkout 与文件冲突。我该如何进行?

java - TimeZone.getDefault() Attribute value must be constant 错误

java - Neo4j获取TransactionEventHandler的信息

Neo4j 父子关系

neo4j - 返回关系源节点内的关系计数

neo4j - Neo4j Community 2.3.2 上的回滚/撤消?

java - 将元素添加到 JList 时如何获取要在 JTextfield 中显示的整数值

spring-boot - 如何使用spring-data-neo4j和Grails 3.3.6解决Spring bean冲突

neo4j - 在 LOAD CSV 期间最好使用 CREATE CONSTRAINT