【问题标题】:How to use multithreading for gremlin edge creation如何使用多线程来创建 gremlin 边缘
【发布时间】:2018-06-29 09:26:42
【问题描述】:

我一直在研究 tinkerpop gremlin 图,最近我可以用它执行很多东西,现在我在尝试处理数千个顶点和边的时候感到震惊,它需要大约一小时完成该过程,我如何将parallelStream()操作应用于以下部分:

for(String s : somelist){
  String[] ss = s.split(",");
  graphTraversal().addEdge(ss[0], ss[1]);
}

“somelist”包含每条边的源顶点和目标顶点的信息(大约 65,000 个)。

【问题讨论】:

  • 你用的是什么图数据库?
  • TinkerGraph @stephenmallette

标签: java gremlin tinkerpop


【解决方案1】:

TinkerGraph 在技术上并不是完全线程安全的写入。根据您正在加载的内容以及加载方式,您可能会遇到一些问题。我不能确切地说出这些问题是什么以及您可能需要做些什么来避免它们,但我们绝对没有以这种方式测试过 TinkerGraph。

也就是说,即使在单线程操作模式下,您在示例代码中指定格式的 65,000 条边也不应该需要一个小时才能加载到 TinkerGraph 中。这听起来有点过分。我假设您的示例代码不是您实际执行的代码,因为这不是有效的 Gremlin 语法,所以很难说可能是什么问题。

【讨论】:

  • 其实这只是一个方法调用,方法执行这个:- g.V().has("id", ss0).out("Link").has("id", ss1 ).fold() .coalesce(.unfold(), _.addE("BelongsTo").from(.V(v4)).to(_.V (v3))).iterate();能否以更快的方式完成?
  • 您是否在“id”上为您的顶点创建了索引?另外...我认为您可以这样做from(v4).to(v3) - 无需重新查找那些便宜的顶点,但是您正在构建额外的步骤,没有什么重要的原因。
  • 不,我还没有创建索引,我只是利用 gremlin 本身创建的默认 ID,我只关心重复,这就是为什么不关心索引的原因,我也不知道它是否会加快我的程序?
  • has("id", ss0) 不是您通过 TinkerGraph 创建的默认 ID 查找的方式。在这种情况下,您指的是一个名为“id”的属性。如果您想要图形创建的标识符,那么您需要执行g.V(ss0)has(id, ss0)。但是,如果“id”是您分配的属性,那么您应该为它创建一个索引,否则您将为每次查找迭代所有顶点。
  • 在创建图表时创建索引。您没有将 Vertex.class 分配给“id”,而是说“为名为 'id' 的属性名称创建顶点索引” - 因此方法名称为 createIndex()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2018-08-12
相关资源
最近更新 更多