2016-06-16 2 views
3

У нас есть ориентир с вершинами и облегченными краями. Теперь есть две вершины, которые должны иметь ребро между ними. Однако край кажется уходящим с одной стороны, но не входящим от другого. Я думал, что края OrientDb всегда проходили в обоих направлениях.ОриентDb край только соединен с одной стороны

Screenshot of web interface

Как вы можете видеть, 15: 3 имеют затраченные края до 17: 1, а 17: 1 не имеет соответствующий в ребре.

Что здесь происходит? Это ошибка или это действительно приемлемая ситуация в OrientDb?

FYI это база данных разработчиков. Никто не обращается к db между двумя запросами с экрана. Проблема трудно воспроизвести, потому что это не всегда происходит.

EDIT: дополнительная информация

Использование OrientDb 2.1.9. Края создаются с использованием API-интерфейса tinkerpop. Мы используем транзакции (хотя эта проблема не обязательно возникает после одной транзакции. Опять же, проблема трудно изолировать и реплицировать).

+1

Вы сделали некоторые операции удаления раньше? –

+0

Нет, мы вообще не делаем никаких удалений –

+1

Мне нужна еще пара информации: 1) Ориентированная версия для вас. 2) Как вы делаете создание вершины/края (какой API)? 3) Используете ли вы транзакции? –

ответ

0

Так, видимо, это происходит, когда вы делаете следующее:

 OrientGraph tx = factory.getTx(); 
     Vertex vertex1 = createVertex(tx); 
     Vertex vertex2 = createVertex(tx); 
     Supplier<Vertex> getTargetVertex =() -> { 
      Iterable<Vertex> vertices = tx.command(new OCommandSQL("select from " + targetRid).execute(); 
      return vertices.iterator().next(); 
     }; 
     vertex1.addEdge(ClassNames.REFERENCE, getTargetVertex.get()); 
     vertex2.addEdge(ClassNames.REFERENCE, getTargetVertex.get()); 
     tx.commit(); 

Допустим, целевая вершина в базе данных имеет версию 1. В этом примере вершина извлекается дважды и два ребра расположены в этой вершине , Это делает так, что будет две целевые вершины с версией 2. При фиксации OrientDb выбирает один (выглядит как всегда первый) и фиксирует эту целевую вершину.

Решение состоит в том, чтобы только один раз отображать целевую вершину для каждой транзакции.

Было бы могучая приятно OrientDb бросить исключение или что-то подобное, хотя ...

Смежные вопросы