2017-10-05 3 views
1

내가 데이터를 같은 방법으로 조직이 : 모든 학생은 100 ~ 숙제를 가지고Arangodb AQL 쿼리

enter image description here

교사의 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 쿼리를 작성하는 가장 좋은 방법은 속성 별 모든 경로의 부분을 필터링하는 그래프의 정점에 어떻게 접근 할 수 있습니까? 결과를 페이지 매김하여 메모리를 절약하고 쿼리를 빠르게 할 수 있습니까? 어떻게하면 속도를 높일 수 있습니까?

감사합니다. 교사와 학생을 가정

답변

관련 문제