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

hav*_*ang 2 graph-databases gremlin tinkerpop janusgraph

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

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

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");
Run Code Online (Sandbox Code Playgroud)

这是运行此命令的示例输出:

(1) - Add vertex traversal only took 15 millis
(2) - Add vertex traversal and next took 739 millis
(3) - Add vertex method took 682 millis
Run Code Online (Sandbox Code Playgroud)

这向我暗示 (3) 添加 JanusGraphaddVertex与 (2) 类似,但我不明白为什么时间差异如此之大。是什么导致 (2) 和 (3) 的运行时间比 (1) 长一个数量级?

ste*_*tte 5

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