2017-10-05 124 views
1

我有数据组织这样的方式:Arangodb AQL查询

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

我得到了我的家庭作业,我甚至可以尝试进行筛选,但是查询太慢 - 我相信这是一种不正确的方式。

问题1如何在一次无法获得所有Homeworks大量内存(极限或其他)的情况下,通过顶点属性快速高效地排序和过滤Homeworks?我确定在查询/子查询的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 

注意边缘过滤我们的查询可以彼此相关的可能性,因为相同的TE acher可以直接与一个学生相关,也可以通过一个班级,我们可以有非独特的家庭作业。因此建议使用RETURN DISTINCT homeworks。但是如果重复不成问题,上面的查询应该可以工作

+0

谢谢你的回答:查询速度非常快。 如果我想按家庭作业属性过滤该怎么办?只需添加 ... FOR家庭作业IN 1个出境v图 “graph_name” ** FILTER homeworks.attr1 == '值1' ** LIMIT LOWERLIMIT,numberOfItems RETURN家庭作业 ... 太慢了,并且,据我所知,对于图形查询,ArangoDB不使用顶点属性索引。 – anton

+0

如果您只是想按家庭作业属性过滤家庭作业,则可以在作业集合中简单循环,而无需使用图形查询。 '在home_work_collection_name中为hw FILTER hw.attr1 =='value1'return hw'。此外,建议您通过'attr1'属性为您的收藏索引。一旦你有了过滤作业,你可以遍历图形并相应地获得教师或者课程的信息。 相反(建议),您可以在上面的答案中的查询中添加一个“过滤器”。就在'LIMIT lowerLimit,numberOfItems'行之上 – Prasanna