如何删除两个顶点之间的边缘?

11
我想删除两个顶点之间的边,所以我的Java Tinkerpop3代码如下:

我想要删去两个顶点之间的边,因此我的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.
                }
            }
        }
    }

有没有更简单的方法通过直接查询边来删除两个顶点之间的边并将其删除?谢谢你的帮助。

1个回答

22
这是如何在两个顶点之间删除边(只有这两个顶点的id)的示例:

这是如何在两个顶点之间删除边(只有这两个顶点的id)的示例:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).bothE()
==>e[9][1-created->3]
==>e[7][1-knows->2]
==>e[8][1-knows->4]

为了举例说明,假设我们想要删除顶点1和顶点2之间的边。我们可以使用以下方法找到它们:

gremlin> g.V(1).bothE().where(otherV().hasId(2))
==>e[7][1-knows->2]

然后使用以下方法将其删除:

gremlin> g.V(1).bothE().where(otherV().hasId(2)).drop()
gremlin> g.V(1).bothE()
==>e[9][1-created->3]
==>e[8][1-knows->4]

如果您有实际的顶点,那么您可以直接执行:

gremlin> g.V(v1).bothE().where(otherV().is(v2)).drop()
gremlin> g.V(1).bothE()
==>e[9][1-created->3]
==>e[8][1-knows->4]

你可以将函数改写为:

private void removeEdgeOfTwoVertices(Vertex fromV, Vertex toV,String edgeLabel,GraphTraversalSource g){
    g.V(fromV).bothE().hasLabel(edgeLabel).where(__.otherV().is(toV)).drop().iterate();
    g.tx().commit();    
}

谢谢。这对我非常有帮助。Tinkerpop3是新的,没有太多的例子。如果可能的话,你能给我更多的资源、链接或参考资料吗?我需要从例子中学习更多的Gremlin来优化代码。再次感谢你。 - MichaelP
1
更多的文档正在开发中,但目前您只有参考文档,其中包含几乎所有可用步骤的示例。 - stephen mallette
当我将代码更改为g.V(fromV).bothE(edgeLabel).where(__.otherV().is(toV)).drop().iterate(); g.tx().commit();时,它可以正常工作。 - MichaelP
我猜drop()不会自动迭代 - 我以为它是一个终止步骤 - 对此很抱歉。 - stephen mallette
确切地说,这种语言的问题在于事情不会立即发生。直到 drop() 只是一个 pipeline,只有在调用 iterate()next() 时才会执行。他们在控制台中展示它,这自动消耗了命令,所以所有指令中都有一个隐藏的步骤。 - Kuzeko
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接