У меня данные организованы таким образом:
Учителей 1к, учеников 10к, у каждого ученика ~ 100 домашних заданий.
Мне нужно получить все домашние задания учеников, связанные с учителем через классы или посредством прямой связи между ними. Все вершины и ребра имеют некоторые атрибуты, и предположим, что все необходимые индексы уже построены, или мы можем обсудить их чуть позже.
Я могу получить все необходимые идентификаторы учеников таким достаточно быстрым запросом:
$query1 = "FOR v1 IN 1..1 INBOUND @teacherId teacher_pupil FILTER v1.deleted == false RETURN DISTINCT v1._id";
$query2 = "FOR v2 IN 2..2 INBOUND @teacherId OUTBOUND teacher_class, INBOUND pupil_class FILTER v2.deleted == false RETURN DISTINCT v2._id";
$queryUnion = "FOR x IN UNION_DISTINCT (($query1), ($query2)) RETURN x";
Тогда я написал следующее:
$query = "
LET pupilIds = ($queryUnion)
FOR pupilId IN pupilIds
LET homeworks = (
FOR homework IN 1..1 ANY pupilId pupil_homework
return [homework._id, pupilId]
)
RETURN homeworks";
У меня есть домашние задания, и я даже могу попробовать отфильтровать их, но запрос слишком медленный - я считаю, что это неправильный способ.
Вопрос 1. Как я могу сделать это, не загружая все домашние задания в память за раз (LIMIT или что-то еще), быстро и эффективно сортируя и фильтруя домашние задания по атрибутам вершин? Я уверен, что ограничение учеников или домашних заданий, связанных с учениками, в запросе / подзапросе FOR приводит к неправильной сортировке / разбиению на страницы.
Я сделал еще одну попытку с запросом AQL на чистом графике:
$query1 = "FOR v1 IN 2..2 INBOUND @teacherId pupil_teacher, OUTBOUND pupil_homework RETURN v1._id";
$query2 = "FOR v2 IN 3..3 INBOUND @teacherId teacher_class, pupil_class, OUTBOUND pupil_homework RETURN v2._id";
$query = "FOR x IN UNION_DISTINCT (($query1), ($query2)) LIMIT 500, 500 RETURN x";
Это не намного быстрее, и я не знаю, как фильтровать вершины Учителя по атрибутам.
Вопрос 2. Какой подход лучше всего подходит для построения таких AQL-запросов, как я могу получить доступ к вершинам графа, фильтруя все части пути по атрибутам? Могу ли я разбить результат на страницы, чтобы сэкономить память и ускорить запрос? Как мне вообще его ускорить?
Спасибо!
FOR hw in home_work_collection_name FILTER hw.attr1 == 'value1' return hw
. Кроме того, рекомендуется индексировать вашу коллекцию по атрибутуattr1
. Когда у вас есть отфильтрованное домашнее задание, вы можете просмотреть график и соответственно получить информацию об учителе или классах. И наоборот (предлагается) вы можете добавитьfilter
в запрос, приведенный в ответе выше. Чуть выше линииLIMIT lowerLimit,numberOfItems
21.11.2017