Titan图形API消除了错误的边缘

时间:2018-10-31 22:32:31

标签: titan tinkerpop

我正在使用Java Titan API移除2个顶点之间的边,如下所示:

public void deleteEdge(Vertex vFrom, Vertex vTo, String edgeName) {

  Iterator<Edge> iter = getEdges(vFrom, Direction.OUT, edgeName);
            TitanEdge te = null;
            while (iter.hasNext()) {
                te = (TitanEdge) iter.next();
                TitanVertex tvTo = te.otherVertex(vFrom);
                if (vTo == tvTo) {
                    break;
                }
            }

            if (te != null) { ***----> this is the issue when edge is not present this is set to the last edge present on vFrom and it gets deleted because of this condition. Fixed it to set boolean if edge found and use it with this condition.***
                te.remove();
            }
}

上面删除方法中使用的

getEdges()方法是:

public Iterator<Edge> getEdges(Vertex v, Direction dir, String... labels) {
        if (v == null)
            return null;
        TitanVertex tv = (TitanVertex) v;
        Iterator<Edge> iter = (labels == null) ? tv.edges(dir) : tv.edges(dir,
                labels);
        return iter;
    }

我的图形顶点和边如下:

  1. NodeA ------ X ----> Node1:TX
  2. Node1:RX ----- X ----> NodeA

  3. NodeA ------ X ----> Node2:TX

  4. Node2:RX ----- X ----> NodeA

  5. NodeA ------ X ----> Node3:TX

  6. Node3:RX ----- X ----> NodeA

由于某些神秘的原因,有时执行3到6时,我看到有1个被删除。

这是一种非常奇怪的行为,它不一致,并且不会一直发生。

我正在使用以Titan图为后盾的cassndara。


我不知道TX节点边缘如何丢失。

TX / RX节点之间的唯一区别是NodeA是具有TX的fromNode和具有RX的toNode。

因此,基于我共享的getEdges方法,它将检索NodeA是该边缘的fromNode的所有其他边缘,并且仅当NodeA是toNode时才检索特定的边缘。

但是代码仍然将vTo与输入To节点进行比较,以在删除边缘之前验证边缘与from和To相同。

此代码如何将边缘从相同的Node移除到与输入toNode不同的toNode,这是一个谜。

我也担心使用==来比较toNode的代码,但是到目前为止它的工作情况还不错,并且删除对于输入边永远不会失败,只是有时也删除了其他边。

这没有意义,因为当代码将toNode与输入匹配时,代码会中断,因此它甚至不应该尝试删除任何其他边缘。

即使出于某种神秘的原因,它成功地将toNode与其他toNode进行了比较,并删除了错误的边缘,但是从边缘中断的右边缘就永远不会被删除。


我想知道它是否存在群集问题,但是在没有任何群集的单节点cassanda上也会发生同样的问题。


注意事项:

有些应用程序代码在同一边缘上两次调用deleteEdge。 在删除边缘之后,deleteEdge方法不提交任何内容。 完成针对用例的所有操作后,将提交应用程序代码。

一旦我纠正了发送重复删除的应用程序问题,该问题似乎就可以解决。

因此,第一个删除操作将删除边,第二个删除操作将进来,而第一个删除尚未提交,因此它可以获得相同的边并再次将其删除。

但是,我很好奇这是如何导致有时错误的边缘被删除的地方。


我仍然对使用==来比较toVertex感到好奇。

它首先使用getVertex来获取顶点。

然后,它使用frm.getEdges来获取tototex的边缘。 不确定边缘的toVertex如何与调用getVertex以获得toVertex返回的对象相同。

但是我不知道titan api的内部含义,因此正如我所说的,它永远不会删除输入边。


这个问题使我非常好奇,但是我不愿意在任何地方找到任何相关的信息或问题。

我非常想知道任何帮助/指针,因为我想知道如何实现。 (我已经修复了应用程序代码,不发送重复的删除,但对重复删除如何导致titan api删除错误的边缘感到好奇)

我正在使用Titan api 1.0.0

1 个答案:

答案 0 :(得分:0)

找到了根本原因,Titan API没有问题。如果您发现while循环后检查te!= null,则deleteEdge的应用程序代码出现问题。当同一标签的边缘不止一个时,则在第二次重复删除时te不为null,并且它是vFrom顶点的最后一个边缘,并且将其删除。当您尝试删除不存在的边缘时,会发生这种情况。我感到非常恼火,以至于我没早意识到这个错误。 :) :)感谢所有看过这个问题的人..一切都很好:):)