Я использую Azure Cosmos DB [Gremlin API] для хранения иерархической информации. Я поддерживаю ParentChild Relationship среди моих вершин, используя ребра типа 'ParentOf'.
Требование: с учетом известной родительской вершины извлечь все дочерние вершины [рекурсивно выведенные] из вершины.
Проблема: я использую приведенные ниже запросы для получения необходимых ребер и вершин.
Получить все вершины в vertexX Иерархия: gV (). HasLabel ('company'). Has ('CompanyName', 'vertexX'). Emit (). Repeat (out ('ParentOf')).. До (__ .outE (). Count (). есть (0))
Получить все края в иерархии vertexX. Мы выбираем только ребра, определенные отношением 'ParentOf': gV (). HasLabel ('company'). Has ('CompanyName', 'vertexX'). Emit (). повторить (из ( 'ParentOf')). до (__. Oute (). Count (). есть (0)). Oute ( 'ParentOf')
Проблема: при наличии иерархии, в которой расстояние между большими дочерними элементами больше 32, вышеуказанный запрос завершается с ошибкой ниже: gV (). HasLabel ('company'). Has ('CompanyName', 'SR101'). Emit () .repeat (out ('ParentOf')). Пока (__. outE (). count (). is (0)). values ('CompanyName'): Ошибка оценки сценария: ActivityId: b1f1fc11-f616-4ea4-8301- 8e2eb32711d1 ExceptionType: GraphRuntimeException ExceptionMessage: Ошибка выполнения запроса Gremlin: превышено максимальное количество циклов на шаге repeat (). Не может превышать 32 цикла. Рекомендуется ограничить число циклов с помощью шага times (n) или с помощью условия loops (). Например, ... ... -execquery GraphInterOpStatusCode: GraphRuntimeError HResult: 0x80131500
Я пытался, если шаг subgraph () может быть полезен, но напрасно, так как cosmosdb имеет ограниченные шаги gremlin, которые можно использовать
Похоже, это ограничение. Существуют ли известные передовые практики или обходные пути для этого сценария.