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

Why is JanusGraph's addVertex() much slower than addV() with a graph traversal?

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

我正在使用 JanusGraph 版本 0.2.0cql 作为存储后端。我创建了一个测试来比较使用三种方法向图形添加和提交顶点所需的时间(以毫秒为单位):(1) addV() gremlin 函数,(2) addV() gremlin 函数后跟 next() 获取新创建的顶点的步骤,以及 (3) JanusGraph 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");

这是 运行 的示例输出:

(1) - Add vertex traversal only took 15 millis
(2) - Add vertex traversal and next took 739 millis
(3) - Add vertex method took 682 millis

这向我暗示了 (3) 与 JanusGraph addVertex 相加的结果与 (2) 类似,但我不明白为什么时差如此之大。是什么导致 (2) 和 (3) 比 (1) 长 运行 个数量级?

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