2016-06-07 34 views
0

以我曲線圖中,用戶連接到許多項目,每個項目都被遞歸地分割成許多子項。由於我的項目有一個特定的順序,我考慮這兩個選項,我的數據模型:想法提高我AQL查詢

enter image description here

現在我想創建一個查詢檢索中的兩個級別定UserID。這AQL是我第一次嘗試:

for itemId in (for b in board filter b._from == @_from sort b.order return b._to) 
    for item1 in (for t in item filter t._id == itemId return keep(t, '_id', 'title')) 
     return merge(item1, {board: (
      for itemId2 in (for b in board filter b._from == item1._id sort b.order return b._to) 
       for t in item filter t._id == itemId2 return keep(t, '_id', 'title') 
     )}) 

的查詢工作,它輸出這樣的結果:

[ 
    { 
    "title": "item 1", 
    "_id": "item/41260117498", 
    "board": [ 
     { 
     "title": "item 4", 
     "_id": "item/42205736442" 
     }, 
     { 
     "title": "item 5", 
     "_id": "item/42208423418" 
     } 
    ] 
    }, 
    { 
    "title": "item 2", 
    "_id": "item/41260772858", 
    "board": [] 
    }, 
    { 
    "title": "item 3", 
    "_id": "item/41883233786", 
    "board": [] 
    } 
] 

這很好,但我覺得我的查詢是這樣一個簡單的穿越不必要的複雜性。請有人幫助我創造一個更好的嗎?

回答

1

在使用graph database點是利用其圖形查詢功能讓它處理的邊緣,而不是由人工加入的邊緣,做你自己。

我將演示pattern matching traversals這樣的查詢;他們在透氣的底部爲你處理邊緣(_from_to)的透視。

首先你會create a graph配置您的邊緣關係,我們使用了簡單的匿名圖表。你有優勢集合board和頂點集合useritem

首先,你乾脆讓運行整個查詢來獲取它是如何工作的感覺,並察看了一個滿結果:

FOR v, e, p IN 1..3 OUTBOUND 'user/andy' board RETURN {v: v, e: e, p: p} 

你看,你只需要指定起始節點和邊緣集board,它會通過檢查邊來找到要自己查詢的頂點集合。

現在,我們可以添加FILTER s到忽略邊和頂點,我們不喜歡:

FOR v, e, p IN 1..3 OUTBOUND 'user/andy' board 
    FILTER e.title == 'item 2' 
    FILTER p.edges[1].title != 'item 1' 
    RETURN {v: v, e: e, p: p} 

的示例包含兩個FILTER指令;一個是匹配每個邊緣具有title屬性等於"item 2",另一種是相匹配的是,在遍歷所述第一邊緣具有包含title"item 1"

Finaly我們use document manipulation只獲取文件的部分我們喜歡:

FOR v, e, p IN 1..3 OUTBOUND 'user/andy' board 
    FILTER e.title == 'item 2' 
    RETURN {v: v, e: {title: e.title, _id: e._id}, pathEdgeTitle: p.edges[*].title}