Первое серьезное изменение, которое вы можете сделать, это не беспокоить повторение всех значений V()
снова для «USER» - это уже результат предыдущих шагов, поэтому сбор «q-2» для использования его в качестве фильтра неКажется необходимым:
g.V().
has('id', 'group_1').
repeat(out("STUDENT", "SUBGROUP")).
until(hasLabel("USER")).
aggregate("q-1").
V().
has('id', 'group_2').
repeat(out("STUDENT", "SUBGROUP")).
until(hasLabel("USER")).
where(within("q-1")).
# We add some more filtering here, such as search terms
dedup().
range(0, 10).
values("id")
Это уже должно быть огромной экономией для вашего запроса, потому что это изменение позволяет избежать итерации всего графа в памяти (т. е. полного сканирования всех вершин), поскольку там не было поиска по индексу.
Я не знаю, какие у вас дополнительные фильтры:
# We add some more filtering here, such as search terms
, но я бы определенно попытался отфильтровать пользователей раньше в вашем запросе, а не позже.Возможно, рассмотрите возможность использования emit()
на вашем repeats()
для лучшей фильтрацииВам, вероятно, следует также dedup()
свой "q-1" и уменьшить размер списка там.
Мне было бы интересно узнать, насколько сработает только начальное изменение, которое я предложил, поскольку это, вероятно, самая большая часть стоимости вашего запроса (если, конечно, у вас нет действительно глубокого / широкого дерева учащихся / подгрупп),Возможно, здесь есть еще кое-что, но было бы неплохо знать, что у вас, по крайней мере, есть обходной путь с удовлетворительной производительностью на этом этапе.