gremlin fold () unwold () выдает ошибки: «Вершина с идентификатором 70 была удалена» и «Входящий объект не может быть удален» - PullRequest
0 голосов
/ 09 июля 2020

Этот запрос работает:

choose(V().hasLabel("user"), V().hasLabel("user").drop())

Но выполняет поиск вершины «пользователь» 2 раза, я хочу оптимизировать его до 1 раза, поэтому я изменил его для этого:

choose(V().hasLabel("user").fold(), unfold().drop())

Если я проделаю этот трюк несколько раз в своем запросе, он выдаст:

Error: ResponseError: Server error: Vertex with id 70 was removed. (500)

Я не понимаю, что это значит, возможно, fold () не перезаписывает предыдущие вызовы fold (), я не 'Не знаю.

Есть ли альтернатива функции fold () uninold () для этого варианта использования? Я пробовал:

choose(V().hasLabel("user").as("u"), select("u").drop())

, но это не работает, кажется, .as() ничего не сохраняет, когда вызывается внутри choose()

Я также пробовал:

choose(V().hasLabel("user").store("u"), select("u").drop())

Но выдает другую ошибку, которую я не понимаю: The incoming object is not removable

1 Ответ

0 голосов
/ 09 июля 2020

Ваша первая попытка с:

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 вам не нужно проверять наличие чего-либо, чтобы удалить это, и на самом деле дешевле не делать этого, как упоминалось ранее.

...