Я попробовал вариант вашего кода, используя «современный» игрушечный граф, и ваш код оказался мне подходящим. Я считаю, что следующее отражает дух того, что вы делали:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().property('version',1).iterate()
gremlin> name = 'marko'
==>marko
gremlin> oldVersion = 1
==>1
gremlin> version = 2
==>2
gremlin> g.V().has('person','name',name).
......1> fold().
......2> coalesce(unfold(),
......3> addV('person').property('name',name).property('version',version)).
......4> choose(values('version').is(oldVersion),
......5> property('version', version).constant('edited'),
......6> constant('same'))
==>edited
gremlin> g.V().has('person','name',name).
......1> fold().
......2> coalesce(unfold(),
......3> addV('person').property('name',name).property('version',version)).
......4> choose(values('version').is(oldVersion),
......5> property('version', version).constant('edited'),
......6> constant('same'))
==>same
gremlin> name = 'stephen'
==>stephen
gremlin> g.V().has('person','name',name).
......1> fold().
......2> coalesce(unfold(),
......3> addV('person').property('name',name).property('version',version)).
......4> choose(values('version').is(oldVersion),
......5> property('version', version).constant('edited'),
......6> constant('same'))
==>same
gremlin> g.V().has('person','name',name).
......1> fold().
......2> coalesce(unfold(),
......3> addV('person').property('name',name).property('version',version)).
......4> choose(values('version').is(oldVersion),
......5> property('version', version).constant('edited'),
......6> constant('same'))
==>same
gremlin> oldVersion = 2
==>2
gremlin> version = 3
==>3
gremlin>
gremlin> g.V().has('person','name',name).
......1> fold().
......2> coalesce(unfold(),
......3> addV('person').property('name',name).property('version',version)).
......4> choose(values('version').is(oldVersion),
......5> property('version', version).constant('edited'),
......6> constant('same'))
==>edited
gremlin> g.V().has('person','name',name).
......1> fold().
......2> coalesce(unfold(),
......3> addV('person').property('name',name).property('version',version)).
......4> choose(values('version').is(oldVersion),
......5> property('version', version).constant('edited'),
......6> constant('same'))
==>same
gremlin> g.V().has('person','name','stephen').elementMap()
==>[id:19,label:person,name:stephen,version:3]
Я бы предложил немного упростить, учитывая ваше описание проблемы. Вы заявили, что проблема заключалась в том, что:
Не удается создать вершину, более поздний запрос не может ее найти.
Работает ли это правильно, если вы удалите choose()
логика? Другими словами, можете ли вы заставить работать базовую операцию upsert? Если нет, то проблема кажется изолированной для этой части запроса, хотя то, что у вас есть, похоже, следует рекомендованным методам, поэтому я не уверен, что может быть не так.