Ваша первая попытка с:
choose(V().hasLabel("user"), V().hasLabel("user").drop())
не так дорога, как вы думаете. Часть if
из choose()
(т.е. первый дочерний обход) не выполняет итерацию для всех пользователей. Он немедленно возвращает true
, если один «пользователь» найден ». Ваш дочерний обход then
будет перебирать все« пользовательские »вершины. Кроме того, вы не предоставляете значение false
для choose()
, поэтому в этом случае Я считаю, что вы в конечном итоге вызовете обход drop()
для любой ситуации:
gremlin> g.inject(1).choose(V().hasLabel('no-exist'),constant(1))
==>1
gremlin> g.inject(1).choose(V().hasLabel('no-exist'),constant(1),constant(2))
==>2
Конечно, мне интересно, зачем вам вообще здесь if/then
, потому что вызов V().hasLabel("user").drop()
без choose()
удалит все найденные "пользовательские" вершины, или, если ни одна не найдена, просто ничего не делать.
Для этого обхода:
choose(V().hasLabel("user").fold(), unfold().drop())
обратите внимание, что V().hasLabel("user").fold()
всегда будет возвращать "true", потому что вы fold()
, что является уменьшающим шагом, который вернет List
элементов в потоке. Если поток пуст, вы получите пустой List
и, таким образом, choose()
будет использовать путь true
В любом случае, ваш unfold()
не разворачивает то, что возвращается из первого параметра choose()
- он разворачивает тот же объект Traverser
, переданный на шаг choose()
. У вас нет того, что было перед choose()
поэтому я не могу сказать, что это.
Я не согласен Совершенно уверен, но, основываясь на оставшихся примерах обхода, я думаю, что вы могли неправильно использовать choose()
в целом. Кажется, вам не нужна операция в стиле if/then
или switch
. С Gremlin вам не нужно проверять наличие чего-либо, чтобы удалить это, и на самом деле дешевле не делать этого, как упоминалось ранее.