为什么JanusGraph的addVertex()比具有图形遍历的addV()慢得多?

时间:2019-04-30 18:14:48

标签: graph-databases gremlin tinkerpop janusgraph

我正在使用JanusGraph向由cassandra支持的数据库中添加顶点,并且在使用(1)JanusGraph Java库提供的addVertex()方法与(2)添加顶点时,我注意到性能存在较大差异。 addV()gremlin遍历函数。为什么会有这样的差异?

我正在将JanusGraph版本0.2.0cql用作存储后端。我创建了一个测试,该测试使用三种方法比较将顶点添加和提交到图形所需的时间(以毫秒为单位):( 1)addV() gremlin函数,(2)addV() gremlin函数,后跟{ {1}}步骤来获取新创建的顶点,以及(3)JanusGraph next()方法。我从一个完全空的图形存储开始。我使用的代码可以在下面找到。

addVertex()

这是运行此示例输出:

final Builder builder = JanusGraphFactory.build()
        .set("storage.backend", "cql")
        .set("storage.hostname", Config.get(CommonConfig.cassandra_host));

final JanusGraph graph = builder.open();

long nowMillis = TimeUtils.nowMillis();
graph.traversal().addV("myLabel");
graph.traversal().tx().commit();
System.out.println("(1) - Add vertex traversal only took " + (TimeUtils.nowMillis() - nowMillis) + " millis");

nowMillis = TimeUtils.nowMillis();
graph.traversal().addV("myLabel").next();
graph.traversal().tx().commit();
System.out.println("(2) - Add vertex traversal and next took " + (TimeUtils.nowMillis() - nowMillis) + " millis");

nowMillis = TimeUtils.nowMillis();
graph.addVertex("myLabel");
graph.traversal().tx().commit();
System.out.println("(3) - Add vertex method took " + (TimeUtils.nowMillis() - nowMillis) + " millis");

这向我暗示了(3)与JanusGraph (1) - Add vertex traversal only took 15 millis (2) - Add vertex traversal and next took 739 millis (3) - Add vertex method took 682 millis 相加与(2)相似,但是我不明白为什么时差如此之大。是什么原因导致(2)和(3)的运行时间比(1)长一些?

1 个答案:

答案 0 :(得分:1)

您要测试的Gremlin的第一位实际上并没有创建顶点。您只是在测量Traversal对象的创建,而实际上不是iterating it的创建。另外两个实际上在图中创建了Vertex对象。一般建议不要使用Graph.addVertex(),因为它不是以用户为中心的API,它适用于JanusGraph之类的图形提供程序。仅使用Gremlin语言与您的图形进行交互,这将为您提供最广泛的代码可移植性。