我想删除两个顶点之间的边,所以我的代码在java tinkerpop3中如下
private void removeEdgeOfTwoVertices(Vertex fromV, Vertex toV,String edgeLabel,GraphTraversalSource g){
if(g.V(toV).inE(edgeLabel).bothV().hasId(fromV.id()).hasNext()){
List<Edge> edgeList = g.V(toV).inE(edgeLabel).toList();
for (Edge edge:edgeList){
if(edge.outVertex().id().equals(fromV.id())) {
TitanGraph().tx();
edge.remove();
TitanGraph().tx().commit();
return;//Remove edge ok, now return.
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法通过直接查询到该边缘并删除它来删除两个顶点之间的边缘?谢谢您帮忙.
很明显,在两个顶点之间找到边缘的直接方法是:
graph.traversal().V(outVertex).bothE(edgeLabel).filter(__.otherV().is(inVertex))
Run Code Online (Sandbox Code Playgroud)
我觉得这个filter步骤必须遍历所有边缘,这对于一些有很多边缘的应用来说非常慢.
另一种方式可能是:
traversal = graph.traversal()
.V(outVertex)
.bothE(edgeLabel)
.as("x")
.otherV()
.is(outVertex) // uses index?
.select("x");
Run Code Online (Sandbox Code Playgroud)
我假设第二种方法可能会快得多,因为它将使用ID索引,这将使它比第一种方法更快.
哪一个更快更有效(就IO而言)?
我正在使用泰坦,所以你也可以让你的答案泰坦具体.
在时间方面,似乎第一种方法更快(边缘为顶点20k b
gremlin> clock(100000){g.V(b).bothE().filter(otherV().is(a))}
==>0.0016451789999999999
gremlin> clock(100000){g.V(b).bothE().as("x").otherV().is(a).select("x")}
==>0.0018231140399999999
Run Code Online (Sandbox Code Playgroud)
IO怎么样?