Graph 边上带有ifnotexist的DSE图批写入

Graph 边上带有ifnotexist的DSE图批写入,graph,datastax-enterprise,gremlin,datastax-enterprise-graph,Graph,Datastax Enterprise,Gremlin,Datastax Enterprise Graph,我正在使用DSE图从excel加载数据,并通过java代码准备addE gremlin查询,最后通过DSE图执行它们 在当前的测试中,需要使用两个边缘标签触发40000个addE gremlin查询 1在几分钟内完成此执行的最佳实践是什么? 现在我正在给dseSession.executeGraphnew SimpleGraphStatement提供1000批gremlin查询,这导致异常方法代码太大!在GroovyJarasm.asm.MethodWriter 2对于本用例中的边缘标签,我的模

我正在使用DSE图从excel加载数据,并通过java代码准备addE gremlin查询,最后通过DSE图执行它们

在当前的测试中,需要使用两个边缘标签触发40000个addE gremlin查询

1在几分钟内完成此执行的最佳实践是什么? 现在我正在给dseSession.executeGraphnew SimpleGraphStatement提供1000批gremlin查询,这导致异常方法代码太大!在GroovyJarasm.asm.MethodWriter

2对于本用例中的边缘标签,我的模式定义为单基数。 也可以为顶点使用自定义顶点ID。
因此,如果边缘已经存在,那么DSE应该毫无例外地忽略它?

查询参数应该是一个简单的数组,如下所示:

[[from1, to1, label1], [from2, to2, label2], ...]
for (def triple in arg) {
  def (id1, id2, lbl) = triple
  def v1 = graph.vertices(id1).next()
  def v2 = graph.vertices(id2).next()
  if (!g.V(v1).outE(lbl).filter(inV().is(v2)).hasNext()) {
    v1.addEdge(lbl, v2)
  }
}
那么您的脚本应该如下所示:

[[from1, to1, label1], [from2, to2, label2], ...]
for (def triple in arg) {
  def (id1, id2, lbl) = triple
  def v1 = graph.vertices(id1).next()
  def v2 = graph.vertices(id2).next()
  if (!g.V(v1).outE(lbl).filter(inV().is(v2)).hasNext()) {
    v1.addEdge(lbl, v2)
  }
}
或者:

for (def triple in arg) {
  def (id1, id2, lbl) = triple
  def v1 = graph.vertices(id1).next()
  if (!g.V(v1).outE(lbl).filter(inV().hasId(id2)).hasNext()) {
    v1.addEdge(lbl, graph.vertices(id2).next())
  }
}

尝试两种变体;至少其中一个应该比任何其他解决方案都要好。

我清楚地理解了这两个脚本的逻辑,请指导如何在Java代码中使用此脚本进行测试?您可以在此处找到带有参数的查询/脚本示例:ok Thank will test it,另一个问题是脚本在每次写入之前,即使大多数边都是新的,它也会执行读入if条件。是否有更好的替代方案?好的,要么所有边都是新的,要么您必须先读取,以确定它是否是新的,或者它是否已经存在。没有预先阅读,就没有魔法可以告诉你边缘是否存在。