What and how are you measuring exactly? What are the numbers that you get?
And what is the execution time that you get in Neo4j?
Your code is correct and you should get good performances running it.
I have slightly modified your code to measure the performances and on my
machine it takes in average around 1.1 ms to execute your code. I have
executed it against a single instance db (version 3.6.1-community) running
in a local docker container.
Here is the code:
import com.arangodb.ArangoDB;
import com.arangodb.ArangoGraph;
import com.arangodb.entity.BaseDocument;
import com.arangodb.entity.BaseEdgeDocument;
import com.arangodb.entity.EdgeDefinition;
import com.arangodb.entity.StreamTransactionEntity;
import com.arangodb.model.EdgeCreateOptions;
import com.arangodb.model.StreamTransactionOptions;
import com.arangodb.model.VertexCreateOptions;
import java.util.Collections;
import java.util.Date;
import java.util.UUID;
public class Test {
static String DATABASE = "mydb";
static String GRAPH = "mygraph";
public static void main(String[] args) {
ArangoDB arangoDB = new ArangoDB.Builder()
.host("localhost", 8529)
.build();
if (arangoDB.db(DATABASE).exists()) {
arangoDB.db(DATABASE).drop();
}
arangoDB.db(DATABASE).create();
arangoDB.db(DATABASE).createCollection("MY_test_vertex_from1");
arangoDB.db(DATABASE).createCollection("MY_test_vertex_from2");
arangoDB.db(DATABASE).createCollection("MY_test_vertex_to");
arangoDB.db(DATABASE).createGraph(GRAPH, Collections.singletonList(new
EdgeDefinition()
.collection("MY_test_edge")
.from("MY_test_vertex_from1", "MY_test_vertex_from2")
.to("MY_test_vertex_to")
));
int iterations = 1_000;
// warmup
for (int i = 0; i < iterations; i++) {
String from1 = "from1-" + UUID.randomUUID().toString();
String from2 = "from2-" + UUID.randomUUID().toString();
String to = "to-" + UUID.randomUUID().toString();
addNodes(arangoDB, from1, from2, to);
addEdge(arangoDB, from1, from2, to);
}
long start = new Date().getTime();
for (int i = 0; i < iterations; i++) {
String from1 = "from1-" + UUID.randomUUID().toString();
String from2 = "from2-" + UUID.randomUUID().toString();
String to = "to-" + UUID.randomUUID().toString();
addNodes(arangoDB, from1, from2, to);
addEdge(arangoDB, from1, from2, to);
}
long end = new Date().getTime();
long elapsed = end - start;
System.out.println("elapsed: " + elapsed + " ms");
System.out.println("avg: " + (1.0 * elapsed / iterations) + " ms");
arangoDB.shutdown();
}
private static void addEdge(ArangoDB arangoDB, String from1, String from2,
String to) {
ArangoGraph graph = arangoDB.db(DATABASE).graph(GRAPH);
String[] collections = new String[]{"MY_test_edge"};
StreamTransactionEntity tx = graph.db().beginStreamTransaction(
new StreamTransactionOptions()
.waitForSync(false)
.writeCollections(collections));
EdgeCreateOptions options = new EdgeCreateOptions()
.streamTransactionId(tx.getId())
.waitForSync(false);
try {
BaseEdgeDocument edge = new
BaseEdgeDocument("MY_test_vertex_from1/" + from1, "MY_test_vertex_to/" + to);
graph.edgeCollection("MY_test_edge").insertEdge(edge, options);
edge = new BaseEdgeDocument("MY_test_vertex_from2/" + from2,
"MY_test_vertex_to/" + to);
graph.edgeCollection("MY_test_edge").insertEdge(edge, options);
graph.db().commitStreamTransaction(tx.getId());
} catch (Exception e) {
graph.db().abortStreamTransaction(tx.getId());
throw e;
}
}
private static void addNodes(ArangoDB arangoDB, String from1, String from2,
String to) {
ArangoGraph graph = arangoDB.db(DATABASE).graph(GRAPH);
String[] collections = new String[]{"MY_test_vertex_from1",
"MY_test_vertex_from2", "MY_test_vertex_to"};
StreamTransactionEntity tx = graph.db().beginStreamTransaction(
new StreamTransactionOptions()
.waitForSync(false)
.writeCollections(collections));
VertexCreateOptions options = new VertexCreateOptions()
.streamTransactionId(tx.getId())
.waitForSync(false);
try {
graph.vertexCollection("MY_test_vertex_from1").insertVertex(new
BaseDocument(from1), options);
graph.vertexCollection("MY_test_vertex_from2").insertVertex(new
BaseDocument(from2), options);
graph.vertexCollection("MY_test_vertex_to").insertVertex(new
BaseDocument(to), options);
graph.db().commitStreamTransaction(tx.getId());
} catch (Exception e) {
e.printStackTrace();
graph.db().abortStreamTransaction(tx.getId());
throw e;
}
}
}
On Friday, 14 February 2020 19:27:49 UTC+1, Rob Gratz wrote:
>
>
> I am in the process of evaluating a number of different graph databases
> for use in an existing application. This application currently uses Neo4J
> as the repository but we are looking at whether a switch would make sense.
> As part of the evaluation process, we have created a test harness to
> perform consistent tests across the databases we are evaluating, arangodb
> being one of them. One of the simple tests we are doing is to add nodes
> and edges individually and in batches since that is how our application
> would interact with the DB. What I have found is that arango is 5-6 times
> slower than neo4j in doing these tests. I am currently using the Java
> driver to perform the tests and doing the inserts using the graph api and
> not the generic collection api. I have been following the arango provided
> java guides for adding the nodes and edges and using e StreamingTransaction
> api for doing the batches so I'm not sure where I could be going too wrong
> in my approach. With that said, I don't know how arangodb could be that
> much slower than neo4j.
>
> Following are examples of how I am adding the data (this isn't the
> harness, just an example of how we are adding data). Any feedback as to
> how I can improve the performance would be greatly appreciated.
>
> private void addEdge(ArangoDB arangoDB)
> {
> ArangoGraph graph = arangoDB.db(DATABASE).graph(GRAPH);
> String[] collections = new String[] {"MY_test_edge"};
>
> StreamTransactionEntity tx = graph.db().beginStreamTransaction(
> new StreamTransactionOptions()
> .waitForSync(false)
> .writeCollections(collections));
> EdgeCreateOptions options = new EdgeCreateOptions()
> .streamTransactionId(tx.getId())
> .waitForSync(false);
>
> System.out.println("Transaction collections: " + String.join(",",
> collections));
> try
> {
> BaseEdgeDocument edge = new
> BaseEdgeDocument("MY_test_vertex_from1/MY_from_key1",
> "MY_test_vertex_to/MY_to_key");
> graph.edgeCollection("MY_test_edge").insertEdge(edge, options);
>
> edge = new BaseEdgeDocument("MY_test_vertex_from2/MY_from_key2",
> "MY_test_vertex_to/MY_to_key");
> graph.edgeCollection("MY_test_edge").insertEdge(edge, options);
>
> graph.db().commitStreamTransaction(tx.getId());
> }
> catch (Exception e)
> {
> graph.db().abortStreamTransaction(tx.getId());
> throw e;
> }
> }
>
> private void addNodes(ArangoDB arangoDB)
> {
> ArangoGraph graph = arangoDB.db(DATABASE).graph(GRAPH);
>
> String[] collections = new String[] {"MY_test_vertex_from1",
> "MY_test_vertex_from2", "MY_test_vertex_to"};
> StreamTransactionEntity tx = graph.db().beginStreamTransaction(
> new StreamTransactionOptions()
> .waitForSync(false)
> .writeCollections(collections));
> VertexCreateOptions options = new VertexCreateOptions()
> .streamTransactionId(tx.getId())
> .waitForSync(false);
> try
> {
> graph.vertexCollection("MY_test_vertex_from1").insertVertex(new
> BaseDocument("MY_from_key1"), options);
> graph.vertexCollection("MY_test_vertex_from2").insertVertex(new
> BaseDocument("MY_from_key2"), options);
> graph.vertexCollection("MY_test_vertex_to").insertVertex(new
> BaseDocument("MY_to_key"), options);
> graph.db().commitStreamTransaction(tx.getId());
> }
> catch (Exception e)
> {
> graph.db().abortStreamTransaction(tx.getId());
> }
> }
>
>
--
You received this message because you are subscribed to the Google Groups
"ArangoDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/arangodb/14a68f88-cb41-441a-b05a-ca3133357483%40googlegroups.com.