Optimization Arangodb AQL查询

Optimization Arangodb AQL查询,optimization,graph,query-optimization,arangodb,aql,Optimization,Graph,Query Optimization,Arangodb,Aql,我的数据组织方式如下: 有1千名教师,10万名学生,每个学生约有100份作业 我需要得到所有学生的家庭作业,通过课堂或他们之间的直接联系与老师有关。所有顶点和边都有一些属性,让我们假设所有必需的索引都已经建立,或者我们可以稍后讨论它们 通过这种足够快的查询,我可以获得所有必需的学生ID: $query1 = "FOR v1 IN 1..1 INBOUND @teacherId teacher_pupil FILTER v1.deleted == false RETURN DISTINCT v1

我的数据组织方式如下:

有1千名教师,10万名学生,每个学生约有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";
我得到了我的作业,我甚至可以尝试过滤它们,但是查询太慢了——我相信这是一种不正确的方式

问题1我如何做到这一点,而不让所有的家庭作业一次存储大量内存(限制或其他),快速高效地按顶点属性对家庭作业进行排序和过滤?我确信在查询/子查询的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查询的最佳方法是什么,如何访问按属性过滤所有路径部分的图的顶点?我可以对结果分页以节省内存并加快查询速度吗?我怎样才能加快速度呢


谢谢大家!

假设教师和学生通过班级(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

请注意,由于同一名教师可以直接与学生联系,也可以通过班级与学生联系,因此我们可以使用非唯一的家庭作业。因此,建议使用
返回不同的家庭作业。但是如果重复不是问题,那么上面的查询应该可以

谢谢您的回答:查询速度非常快。如果我想按家庭作业属性筛选怎么办?只是加上。。。对于1出站v图形中的homeworks“GRAPH_name”筛选器homeworks.attr1=='value1'限制下限,numberOfItems返回homeworks。。。太慢了,而且正如我所知,对于图形查询,ArangoDB不使用顶点属性索引。如果您只想按作业属性筛选作业,您可以在作业集合中简单循环,而无需使用图形查询<代码>用于家庭中的硬件\u工作\u集合\u名称筛选器hw.attr1=='value1'返回硬件
。此外,建议您通过
attr1
属性为集合编制索引。一旦你有了过滤过的家庭作业,你就可以遍历图表,得到相应的老师或班级信息。相反(建议)您可以在上面答案中的查询中添加一个
过滤器。刚好在
限制下限上方,numberOfItems