I want to write about 1 million piece of data using upsert
but it took about 10 minutes using upsert, how can I speed up this process?
Here’s the code I write in java client
I need to get the uid of the node by <ex_id> I define for each unique node
so I have write a upsert like this,
and I try to speed up the upsert by using a little batch, each request will get 500 piece of data
if (predicate_class.equals("relation")) {
String object_ex_id = oneTraid.getString("object");
String insideQuery =
" var(func: eq(ex_id, \"" + subject_ex_id + "\")){\n" +
" subject" + i + " as uid\n" +
" }\n" +
" var(func :eq(ex_id, \"" + object_ex_id + "\")){\n" +
" object" + i + " as uid\n" +
" }\n";
allQuery.append(insideQuery);
String muString =
" uid(subject" + i + ") <" + predicate + "> uid(object" + i + ") " +
"(start_time=" + start_time + ", end_time=" + end_time + ") .\n" +
" uid(subject" + i + ") <ex_id> \"" + subject_ex_id + "\" .\n" +
" uid(object" + i + ") <ex_id> \"" + object_ex_id + "\" .\n";
allMutate.append(muString);
} else if (predicate_class.equals("property")) {
String object = oneTraid.getString("object");
String insideQuery =
" var(func: eq(ex_id, \"" + subject_ex_id + "\")){\n" +
" subject" + i + " as uid\n" +
" }\n";
allQuery.append(insideQuery);
String muString =
" uid(subject" + i + ") <" + predicate + "> \"" + object + "\" " +
"(start_time=" + start_time + ", end_time=" + end_time + ") .\n" +
" uid(subject" + i + ") <ex_id> \"" + subject_ex_id + "\" .\n";
allMutate.append(muString);
}
int batchSize = 500;
if (i % batchSize == 0) {
String batchQuery =
" query{\n" +
allQuery +
"}\n";
Mutation batchMu = Mutation.newBuilder()
.setSetNquads(ByteString.copyFromUtf8(allMutate.toString()))
.build();
Transaction txn = dgraphClient.newTransaction();
try {
Request request = Request.newBuilder().setQuery(batchQuery).addMutations(batchMu).setCommitNow(true).build();
txn.doRequest(request);
txn.close();
System.out.println("batch: " + (i / batchSize + 1) + " of " + totalSize / batchSize + " upsert success!");
} catch (Exception e) {
JSONObject result = new JSONObject();
result.put("status", "fail");
System.out.println("batch: " + (i / batchSize + 1) + " of " + totalSize / batchSize + " upsert FAIL!");
e.printStackTrace();
return result;
}
allQuery = new StringBuilder();
allMutate = new StringBuilder();
}
}
JSONObject result = new JSONObject();
result.put("status", "success");
return result;
}
}