Запрос Gremlin не возвращает результатов, когда часть запроса ничего не возвращает
У меня есть запрос gremlin, который находит вершины, которые я хочу заархивировать, но возвращает пустой массив.
Мой график построен таким образом, что у вершины может быть несколько родителей и детей. Когда вершина архивируется, она должна заархивировать всех затронутых потомков, которые были бы "осиротевшими" в результате этого процесса. Если какой-либо из потомков имеет путь назад к центральной вершине, он не должен архивировать его, потому что он не будет "осиротевшим"
g.V(itemId) // Find the item to delete.
.union( // Start a union to return
g.V(itemId), // both the item
g.V(itemId) // and its descendants.
.repeat(__.inE('memberOf').outV().store('x')) // Find all of its descendants.
.cap('x').unfold() // Unfold them.
.where(repeat(out('memberOf') // Check each descendant
.where(hasId(neq(itemId))).simplePath()) // to see if it has a path back that doesn't go through the original vertex
.until(hasId(centralId))) // that ends at the central vertex .
.aggregate('exception') // Aggregate these together.
.select('x').unfold() // Get all the descendants again.
.where(without('exception'))) // Remove the exceptions.
.property('deleted', true) // Set the deleted property.
.valueMap(true) // Rteurn the results.
Когда он обнаруживает, что у некоторых из потомков есть пути назад к центральной вершине, которые не проходят через исходную вершину, тогда он работает и возвращает все результаты, которые он должен. Однако, если он не может найти потомков с путями назад, то в теории он должен просто вернуть всех потомков. Вместо этого он возвращает пустой массив. Я предполагаю, что он застревает после этой стадии обхода, потому что он ничего не находит и поэтому не может перейти ни к чему другому.
Как я могу вернуть всех потомков, если он ничего не находит на этом этапе?
Для примера графика см. Мой предыдущий вопрос.
1 ответ
Измените строку:
.select('x').unfold()
Для того, чтобы:
.cap('x').unfold()