Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java neo4j-使用neo4j rest图形数据库的批插入_Java_Neo4j - Fatal编程技术网

Java neo4j-使用neo4j rest图形数据库的批插入

Java neo4j-使用neo4j rest图形数据库的批插入,java,neo4j,Java,Neo4j,我使用的是2.0.1版 我有几十万个节点需要插入。我的neo4j图形数据库位于一台独立服务器上,我通过neo4j rest图形数据库库使用RestApi来实现这一点 然而,我面临着一个缓慢的性能结果。我已经将我的查询分批处理,在一个http调用中发送500条cypher语句。我得到的结果是: 10:38:10.984 INFO commit 10:38:13.161 INFO commit 10:38:13.277 INFO commit 10:38:15.132 INFO commit 10:

我使用的是2.0.1版

我有几十万个节点需要插入。我的neo4j图形数据库位于一台独立服务器上,我通过neo4j rest图形数据库库使用RestApi来实现这一点

然而,我面临着一个缓慢的性能结果。我已经将我的查询分批处理,在一个http调用中发送500条cypher语句。我得到的结果是:

10:38:10.984 INFO commit
10:38:13.161 INFO commit
10:38:13.277 INFO commit
10:38:15.132 INFO commit
10:38:15.218 INFO commit
10:38:17.288 INFO commit
10:38:19.488 INFO commit
10:38:22.020 INFO commit
10:38:24.806 INFO commit
10:38:27.848 INFO commit
10:38:31.172 INFO commit
10:38:34.767 INFO commit
10:38:38.661 INFO commit
等等。 我使用的查询如下所示:

MERGE (a{main:{val1},prop2:{val2}}) MERGE (b{main:{val3}}) CREATE UNIQUE (a)-[r:relationshipname]-(b);
final RestAPI restAPI = new RestAPIFacade("http://server:7474/db/data");
final RequestResult result = restAPI.execute(RequestType.POST, "ext/CSVBatchImport/graphdb/csv_batch_import",
    new HashMap<String, Object>() {
        {
            put("path", "file://C:/.../neo4j.csv");
        }
    });
我的代码是:

private RestAPI restAPI;
private RestCypherQueryEngine engine;
private GraphDatabaseService graphDB = new RestGraphDatabase("http://localdomain.com:7474/db/data/");

谢谢

更新了基准。 很抱歉造成混淆,我发布的基准不准确,不适用于500个查询。我的ctr变量实际上并不是指密码查询的数量


现在,我每3秒有500个查询,而且这3秒也在不断增加。与嵌入式neo4j相比,它仍然慢得多。

如果您必须能够使用neo4j 2.1.0-M01(暂时不要在prod中使用它!!),您可以从新功能中获益。如果要创建/生成如下CSV文件:

val1,val2,val3
a_value,another_value,yet_another_value
a,b,c
....
您只需启动以下代码:

final GraphDatabaseService graphDB = new RestGraphDatabase("http://server:7474/db/data/");
final RestAPI restAPI = ((RestGraphDatabase) graphDB).getRestAPI();
final RestCypherQueryEngine engine = new RestCypherQueryEngine(restAPI);
final String filePath = "file://C:/your_file_path.csv";
engine.query("USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM '" + filePath
    + "' AS csv MERGE (a{main:csv.val1,prop2:csv.val2}) MERGE (b{main:csv.val3})"
    + " CREATE UNIQUE (a)-[r:relationshipname]->(b);", null);
您必须确保可以从安装服务器的机器上访问该文件

看看在服务器上为您实现这一点的方法。如果您构建此插件并将其放入plugins文件夹,您可以按如下方式在java中使用该插件:

MERGE (a{main:{val1},prop2:{val2}}) MERGE (b{main:{val3}}) CREATE UNIQUE (a)-[r:relationshipname]-(b);
final RestAPI restAPI = new RestAPIFacade("http://server:7474/db/data");
final RequestResult result = restAPI.execute(RequestType.POST, "ext/CSVBatchImport/graphdb/csv_batch_import",
    new HashMap<String, Object>() {
        {
            put("path", "file://C:/.../neo4j.csv");
        }
    });
final RestAPI RestAPI=new RestAPIFacade(“http://server:7474/db/data");
最终RequestResult=restAPI.execute(RequestType.POST,“ext/CSVBatchImport/graphdb/csv\u batch\u import”,
新HashMap(){
{
put(“path”,“file://C:/…/neo4j.csv”);
}
});
编辑:

您还可以在JavaREST包装器中使用BatchCallback来提高性能,并删除事务样板代码。您可以编写类似以下内容的脚本:

final RestAPI restAPI = new RestAPIFacade("http://server:7474/db/data");
int counter = 0;
List<Map<String, Object>> statements = new ArrayList<>();
while (isExists) {
    statements.add(new HashMap<String, Object>() {
        {
            put("val1", "abc");
            put("val2", "abc");
            put("val3", "abc");
        }
    });
    if (++counter % 500 == 0) {
        restAPI.executeBatch(new Process(statements));
        statements = new ArrayList<>();
    }
}

static class Process implements BatchCallback<Object> {

    private static final String QUERY = "MERGE (a{main:{val1},prop2:{val2}}) MERGE (b{main:{val3}}) CREATE UNIQUE (a)-[r:relationshipname]-(b);";

    private List<Map<String, Object>> params;

    Process(final List<Map<String, Object>> params) {
        this.params = params;
    }

    @Override
    public Object recordBatch(final RestAPI restApi) {
        for (final Map<String, Object> param : params) {
            restApi.query(QUERY, param);
        }
        return null;
    }    
}
final RestAPI RestAPI=new RestAPIFacade(“http://server:7474/db/data");
int计数器=0;
列表语句=新的ArrayList();
while(我存在){
add(新的HashMap()语句){
{
看跌期权(“val1”、“abc”);
看跌期权(“val2”、“abc”);
卖出价(“val3”、“abc”);
}
});
如果(++计数器%500==0){
restAPI.executeBatch(新进程(语句));
语句=新的ArrayList();
}
}
静态类进程实现BatchCallback{
private static final String QUERY=“MERGE(a{main:{val1},prop2:{val2}})MERGE(b{main:{val3})CREATE UNIQUE(a)-[r:relationshipname]-(b);”;
私有列表参数;
过程(最终列表参数){
this.params=params;
}
@凌驾
公共对象记录批处理(最终RestAPI RestAPI){
用于(最终映射参数:参数){
restApi.query(查询,参数);
}
返回null;
}    
}

您应该从中给出的提示中获益。请改用事务端点,如果您使用的是Java,您可能需要尝试JDBC驱动程序:Hi Tim!听起来很棒!!我可以拿到2.1.0 M1,但恐怕我们需要在几周内将其部署到prod中。我会注意的。关于让它在2.0.1上工作有什么建议吗?在您发布的另一个SO问题的链接上,它讨论了模式索引。你能解释一下那个想法吗?谢谢谢谢你的更新!我将尝试此操作,并将发布我的基准测试结果。架构索引仅与标签相关,因此您不能将它们用于关系。您好@tstorms,我已更新了我的基准测试,并给出了解释和问题。谢谢我也试过neo4j 2.1.0 M1+你的服务器插件,我得到了更长的结果时间,我需要延长剩余读取超时时间。服务器插件应该是最快的解决方案。当您直接在服务器上工作时,您使用的是嵌入式数据库。正如你所说,这永远是最快的做事方式。