Запрос Gremlin зависает с и / или условием

У меня есть модель графика region (вершина) - ›has_person (край) -› person (вершина). Я хочу получить region вершины с person с именем Том.

Этот запрос работает нормально: g.V().hasLabel("person").has("name", "Tom").inE("has_person").outV().hasLabel("region").

Но почему зависают следующие запросы:

g.V().hasLabel("region").and(
    __.hasLabel("person").has("name", "Tom").inE("has_person").outV().hasLabel("region")
)

g.V().and(
    __.hasLabel("person").has("name", "Tom").inE("has_person").outV().hasLabel("region")
).hasLabel("region")

person coderz    schedule 11.02.2021    source источник


Ответы (1)


При написании обходов графов с помощью Gremlin вам нужно подумать о том, как используемая вами база данных графов оптимизирует ваш обход (например, используется ли глобальный индекс)?

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

Fwiw, ваш запрос, который работает нормально, - это оптимальный способ написать, что я думаю, учитывая то, что вы указываете в качестве желаемого результата. Я не думаю, что ваш первый зависший запрос когда-либо вернет результаты, потому что он требует, чтобы у вершины была метка, которая одновременно является регионом и человеком, что невозможно. Второй зависший запрос, похоже, не требует and() в первую очередь и дважды фильтрует метку региона.

person stephen mallette    schedule 11.02.2021