API-интерфейс Titan Graph, удаляющий неправильный край - PullRequest
0 голосов
/ 01 ноября 2018

Я использую API Java Titan для удаления ребра между 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. Узел A ------ X ----> Узел1: TX
  2. Узел 1: RX ----- X ----> Узел А

  3. Узел A ------ X ----> Узел 2: TX

  4. Узел 2: RX ----- X ----> Узел А

  5. Узел A ------ X ----> Узел 3: TX

  6. Узел 3: RX ----- X ----> Узел А

По некоторым таинственным причинам, когда иногда выполняется от 3 до 6, я вижу, что 1 удаляется.

Это очень странное поведение, оно непоследовательное и не происходит постоянно.

Я использую Кассандару с графом Титана.


Понятия не имею, как пропадает ребро с узлом TX.

Единственное отличие между узлами TX / RX состоит в том, что NodeA - это fromNode с TX и toNode с RX.

Таким образом, основываясь на методе getEdges, которым я поделился, он будет извлекать все остальные ребра, где NodeA - fromNode ребра, и будет извлекать только определенное ребро, когда NodeA - toNode.

Но код по-прежнему сравнивает vTo с входным узлом To, чтобы убедиться, что ребро имеет то же самое из и для To перед удалением ребра.

Это загадка, как этот код может удалить ребро из того же самого узла, но для другого узла, чем вход для узла.

Также меня беспокоит код, использующий == для сравнения toNode, но пока он работает нормально, и удаление никогда не завершается неудачно для входного ребра, просто иногда удаляется и другое ребро.

Это не имеет смысла, потому что код ломается, когда он сопоставляет toNode с вводом, поэтому он даже не должен пытаться удалить любые другие ребра.

Даже если по каким-то таинственным причинам он успешно сравнивается с Узлом с каким-то другим узлом toNode и удаляет этот неправильный край, правый край никогда не будет удален, поскольку он выходит из цикла.


Мне было интересно, возникает ли проблема с кластеризацией, но такая же проблема возникает на одном узле cassanda без какой-либо кластеризации.


Несколько замечаний:

Существует код приложения, который дважды вызывает deleteEdge на одном и том же ребре. метод deleteEdge ничего не фиксирует после удаления ребра. Код приложения фиксируется, когда все сделано для варианта использования.

Как только я исправил проблему приложения с отправкой дубликатов удалений, проблема, кажется, решена.

Таким образом, 1-е удаление удаляет край, 2-е удаление приходит, а 1-е еще не было зафиксировано, поэтому он может получить тот же край и удаляет его снова.

Однако мне очень и очень любопытно, как это иногда приводит к удалению неправильного края где-то.


Мне все еще интересно использовать == для сравнения toVertex.

Сначала он использует getVertex, чтобы добраться до и к вершинам.

Затем он использовал frm.getEdges, чтобы получить ребра, которые имеют значение Vertex. Не уверен, что toVertex on edge может быть тем же объектом, который был возвращен, вызывая getVertex для получения toVertex.

Но я не знаю внутренней реализации API-интерфейса Titan, поэтому, как я уже сказал, никогда не удается удалить входной фронт.


Эта проблема сделала меня очень любопытным, но я не в состоянии найти какую-либо связанную информацию или проблемы, о которых сообщалось где-либо.

Любая помощь / указатели будут очень цениться, так как я хочу знать, как это может произойти. (Я уже исправил код приложения, чтобы он не отправлял повторяющиеся удаления, но мне любопытно, как удаленный дубликат приводит к тому, что titan api удаляет неправильный край)

Я использую Titan API 1.0.0

1 Ответ

0 голосов
/ 22 мая 2019

Основная причина найдена, и нет проблем с Titan API. Код приложения для deleteEdge имеет проблему, если вы заметили, что он проверяет te! = Null после цикла while. Если имеется более одного ребра одной и той же метки, то при повторном удалении 2-го числа te не равно null и является последним ребром из вершины vFrom, и оно удаляется. Это происходит, когда вы пытаетесь удалить край, которого нет. Я чувствую себя настолько раздраженным, что я не понял эту ошибку ранее. :) :) Спасибо всем, кто просмотрел вопрос .. Теперь все хорошо :):)

...