Nano Hash - криптовалюты, майнинг, программирование

Запрос Arangodb AQL

У меня данные организованы таким образом:

введите здесь описание изображения

Учителей 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-запросов, как я могу получить доступ к вершинам графа, фильтруя все части пути по атрибутам? Могу ли я разбить результат на страницы, чтобы сэкономить память и ускорить запрос? Как мне вообще его ускорить?

Спасибо!


Ответы:


1

Предполагая, что учитель и ученик связаны друг с другом через классы (2 исходящие ссылки) или напрямую (одна исходящая ссылка) и без каких-либо других способов, вы можете сделать что-то вроде этого

 FOR v IN 1..2 OUTBOUND "teacher_id" GRAPH "graph_name"
   FILTER LIKE(v._id, "pupil_collection_name/%")
     FOR homeworks IN 1 OUTBOUND v GRAPH "graph_name"
        LIMIT lowerLimit,numberOfItems
           RETURN homeworks

Но если есть вероятность, что учитель и ученик могут быть связаны друг с другом чем-то другим, кроме класса, нам придется отфильтровать наш запрос относительно края, который мы видим.

 FOR v IN 1..2 OUTBOUND "teacher_id" GRAPH "graph_name"
   FILTER LIKE(v._id, "pupil_collection_name/%") && (e.name == "ClassPupil" || e.name == "TeacherPupil")
     FOR homeworks IN 1 OUTBOUND v GRAPH "graph_name"
        LIMIT lowerLimit,numberOfItems
           RETURN homeworks

Обратите внимание: поскольку один и тот же учитель может быть связан с учеником напрямую или через класс, у нас могут быть неуникальные домашние задания. Следовательно, рекомендуется использовать RETURN DISTINCT homeworks. Но если дублирование не является проблемой, приведенный выше запрос должен работать.

17.10.2017
  • Спасибо за ответ: запрос очень быстрый. Что, если я хочу отфильтровать по атрибуту домашнего задания? Просто добавляю ... ДЛЯ домашних заданий IN 1 OUTBOUND v GRAPH имя_графа FILTER homeworks.attr1 == 'value1' LIMIT lowerLimit, numberOfItems RETURN homeworks ... слишком медленно и, как я знаю, для графика запросы ArangoDB не использует индексы атрибутов вершин. 20.11.2017
  • Если вы просто хотите отфильтровать домашнее задание по атрибуту домашнего задания, вы можете простой цикл в коллекции домашних заданий без необходимости использования графического запроса. FOR hw in home_work_collection_name FILTER hw.attr1 == 'value1' return hw. Кроме того, рекомендуется индексировать вашу коллекцию по атрибуту attr1. Когда у вас есть отфильтрованное домашнее задание, вы можете просмотреть график и соответственно получить информацию об учителе или классах. И наоборот (предлагается) вы можете добавить filter в запрос, приведенный в ответе выше. Чуть выше линии LIMIT lowerLimit,numberOfItems 21.11.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..