首页 文章

Arangodb AQL查询

提问于
浏览
1

我有这样组织的数据:

enter image description here

有1k老师,10k学生,每个学生有~100个家庭作业 .

我需要通过课程或通过他们之间的直接联系获得学生的所有作业,与教师相关 . 所有顶点和边都有一些属性,让我们假设已经构建了所有必需的索引,或者稍后我们可以讨论它们 .

我可以通过足够快的查询获得所有必需的学生ID:

$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";

我得到了我的作业,我甚至可以尝试过滤它们,但查询速度太慢 - 这是一种不正确的方式,我相信 .

Question 1 如何在不将所有Homeworks大量存储到内存(LIMIT或其他)的情况下执行此操作,按顶点排序和过滤Homeworks ' attributes fast and efficient? I'确定限制学生或查询/子查询的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";

它的速度并不快,我不知道如何按属性过滤教师顶点 .

Question 2 什么方法最适合构建这样的AQL查询,如何访问图的顶点按属性过滤所有路径的部分?我可以对结果进行分页以节省内存并加快查询速度吗?我怎么能加速呢?

谢谢!

1 回答

  • 1

    假设老师和学生通过课程(2个出站链接)或直接(单个出站链接)和 with no other 方式彼此相关,你可以做这样的事情

    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 . 但是,如果重复不是问题,则上述查询应该有效

相关问题