2017-10-05 123 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