1
내가 데이터를 같은 방법으로 조직이 : 모든 학생은 100 ~ 숙제를 가지고Arangodb AQL 쿼리
교사의 1K, 학생의 10K를있다합니다.
나는 학생의 모든 숙제를 얻거나, 수업을 통해 선생님과 관련되거나, 그들 사이의 직접적인 링크를 통해 접근해야합니다. 모든 꼭지점과 가장자리에는 몇 가지 특성이 있습니다. 필요한 모든 색인이 이미 작성되었다고 가정 해 봅시다.
나는 그런만큼 빠르게 쿼리에 의해 필요한 모든 학생 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 질문 1 모든 Homeworks를 한 번에 (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 0120-이러한 AQL 쿼리를 작성하는 가장 좋은 방법은 속성 별 모든 경로의 부분을 필터링하는 그래프의 정점에 어떻게 접근 할 수 있습니까? 결과를 페이지 매김하여 메모리를 절약하고 쿼리를 빠르게 할 수 있습니까? 어떻게하면 속도를 높일 수 있습니까?
감사합니다. 교사와 학생을 가정