2016-12-24 6 views
0

У меня есть этот код, который существенно обновляет свойства, удаляет все старые IsOfType края и добавляет новые IsOfType края (если удалить все метод/класс абстракции и сделать его рядный):Почему AddEdgeStep не работает после DropStep ребер в том же обходе с использованием Gremlin?

traversal = g.V("Entity:633471488:519").as("entity"); 

//update properties 
traversal.property("text", "new text"); 
traversal.property("description", "new description"); 

//drop typeEdges 
traversal.select("entity").outE("IsOfType").drop(); 
//even that causes the same issue(!): traversal.select("entity").outE("HasInner").drop(); 
System.out.println("traversal after type edges deletion: " +traversal); 

//make new typeEdges 
traversal.V("Entity:996942848:518").as("type-0").addE("IsOfType").from("entity").to("type-0"); 

System.out.println("traversal after type edges addition: " +traversal); 

//storage 
traversal.select("entity").forEachRemaining({}) 

Все работает (даже падение существующих границ IsOfType). Но создание новых краев IsOfType, похоже, не приводит к появлению новых ребер на графике. Если я прокомментирую падение, то создание работает отлично (!) Это как если бы DropStep, который до addEdgeStep происходит в конце. Я даже пытался удалить другой тип ребра, и он вызывает ту же проблему (!). Возможно, неявная обработка транзакций принимает решение о фиксации, когда drop() происходит, как и в случае с next(), iterate() и forEachRemaining() ?? Если это так, то капли и создания не могут произойти в рамках одной и той же транзакции с использованием Fluent API, что делает ее не очень полезной для реальных приложений :(

Вот состояние обходов после удаления и после добавления два IsOfType края в моем счете (я пытался как Java и Datastax Студия консоли):

traversal after type edges deletion: 
[ 
    GraphStep(vertex,[Entity:633471488:519])@[entity], 
    AddPropertyStep({value=[Entity], key=[atClass]}), 
    AddPropertyStep({value=[FilmWithSuperCategories aaa], key=[text]}), 
    AddPropertyStep({value=[dffsdfsd f2313], key=[description]}), 
    SelectOneStep(entity)@[entity], 
    VertexStep(OUT,[IsOfType],edge), 
    DropStep 
] 

traversal after type edges addition: 
[ 
    GraphStep(vertex,[Entity:633471488:519])@[entity], 
    AddPropertyStep({value=[Entity], key=[atClass]}), 
    AddPropertyStep({value=[FilmWithSuperCategories aaa], key=[text]}), 
    AddPropertyStep({value=[dffsdfsd f2313], key=[description]}), 
    SelectOneStep(entity)@[entity], 
    VertexStep(OUT,[IsOfType],edge), 
    DropStep, 
    GraphStep(vertex,[Entity:996942848:518])@[type-0], 
    AddEdgeStep({~from=[[SelectOneStep(entity)]], ~to=[[SelectOneStep(type-0)]], label=[IsOfType]}), 
    GraphStep(vertex,[Entity:1489781376:516])@[type-1], 
    AddEdgeStep({~from=[[SelectOneStep(entity)]], ~to=[[SelectOneStep(type-1)]], label=[IsOfType]}) 
] 

Редактировать

Из того, что я прочитал здесь (http://tinkerpop.apache.org/docs/current/reference/#drop-step)

Шаг() - step (filter/sideEffect) используется для удаления элемента и свойств из графика (т. Удалить). Это шаг фильтра, потому что обход не дает никаких исходящих объектов.

Объектов не найдено, так что после капли ничего нельзя сделать! поэтому мне любопытно, как я могу сделать несколько капель/дополнений в одной транзакции, используя DSE Graph Fluent API

Спасибо!

ответ

1

Вы можете обернуть ваш drop в шаге, например .: sideEffect

g.V(entity1).as("a").sideEffect(outE().filter(inV().is(entity2)).drop()). 
    V(entity2).addE("link").from("a") 
+0

вау вы удивительный! почему я не могу найти документацию о моих случаях использования :(- Я думаю, это потому, что gremlin api сейчас стандартизируется –