我有數據組織這樣的方式:Arangodb AQL查詢
有教師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查詢最好的方法是什麼,如何訪問圖形的頂點按屬性過濾所有路徑的部分?我可以對結果進行分頁以節省內存並加快查詢速度嗎?我怎樣才能加速它呢?
謝謝!
謝謝你的回答:查詢速度非常快。 如果我想按家庭作業屬性過濾該怎麼辦?只需添加 ... FOR家庭作業IN 1個出境v圖 「graph_name」 ** FILTER homeworks.attr1 == '值1' ** LIMIT LOWERLIMIT,numberOfItems RETURN家庭作業 ... 太慢了,並且,據我所知,對於圖形查詢,ArangoDB不使用頂點屬性索引。 – anton
如果您只是想按家庭作業屬性過濾家庭作業,則可以在作業集合中簡單循環,而無需使用圖形查詢。 '在home_work_collection_name中爲hw FILTER hw.attr1 =='value1'return hw'。此外,建議您通過'attr1'屬性爲您的收藏索引。一旦你有了過濾作業,你可以遍歷圖形並相應地獲得教師或者課程的信息。 相反(建議),您可以在上面的答案中的查詢中添加一個「過濾器」。就在'LIMIT lowerLimit,numberOfItems'行之上 – Prasanna