При написании обходов графов с помощью Gremlin вам нужно подумать о том, как используемая вами база данных графов оптимизирует ваш обход (например, используется ли глобальный индекс)?
Вам следует рассмотреть возможность индексирования вашей базы данных графов и изучить выходные данные шага profile()
. Он сообщит вам, используются ли индексы и где. Я предполагаю, что запрос, который работает нормально, использует и индексирует, чтобы найти Тома, а затем может быстро пройти этот индекс, чтобы найти регионы, у которых есть ребра has_person, связанные с ним. Практически любой график сможет оптимизировать такой шаблон. Ваши следующие запросы, которые зависают, обычно не будут оптимизированы большинством графиков для использования индекса, и это в основном из-за шаблона, который вы выбрали с шагом and()
, который не является шаблоном, который ищут большинство оптимизаций. Я предполагаю, что оба этих обхода почти полностью фильтруются в памяти.
Fwiw, ваш запрос, который работает нормально, - это оптимальный способ написать, что я думаю, учитывая то, что вы указываете в качестве желаемого результата. Я не думаю, что ваш первый зависший запрос когда-либо вернет результаты, потому что он требует, чтобы у вершины была метка, которая одновременно является регионом и человеком, что невозможно. Второй зависший запрос, похоже, не требует and()
в первую очередь и дважды фильтрует метку региона.
person
stephen mallette
schedule
11.02.2021