Запрос Gremlin не возвращает результатов, когда часть запроса ничего не возвращает - PullRequest
0 голосов
/ 25 марта 2019

У меня есть запрос 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 Ответ

1 голос
/ 27 марта 2019

Изменить строку:

.select('x').unfold()

Кому:

.cap('x').unfold()
...