gpt4 book ai didi

java - neo4j - 使用 neo4j rest graph db 批量插入

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:35 25 4
gpt4 key购买 nike

我使用的是 2.0.1 版。

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

但是,我遇到了一个缓慢的性能结果。我已将我的查询分成多个批处理,在单个 http 调用中发送 500 个密码语句。我得到的结果是这样的:

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);

我的代码是这样的:

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

...

restAPI = ((RestGraphDatabase) graphDB).getRestAPI();
engine = new RestCypherQueryEngine(restAPI);

...

    Transaction tx = graphDB.getRestAPI().beginTx();

try {
int ctr = 0;
while (isExists) {
ctr++;
//excute query here through engine.query()
if (ctr % 500 == 0) {
tx.success();
tx.close();
tx = graphDB.getRestAPI().beginTx();
LOGGER.info("commit");
}
}
tx.success();
} catch (FileNotFoundException | NumberFormatException | ArrayIndexOutOfBoundsException e) {
tx.failure();
} finally {
tx.close();
}

谢谢!

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

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

最佳答案

如果您必须能够使用 Neo4j 2.1.0-M01(还不要在产品中使用它!!),您可以从新功能中受益。如果您要像这样创建/生成 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);

您必须确保可以从安装服务器的计算机访问该文件。

看看my server plugin在服务器上为您执行此操作。如果您构建它并将其放入插件文件夹,则可以按如下方式在 java 中使用该插件:

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");
}
});

编辑:

您还可以在 java REST 包装器中使用 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;
}
}

关于java - neo4j - 使用 neo4j rest graph db 批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22526396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com