database - Ideas to improve my AQL query -


in graph, user connected many items , each item can recursively divided many sub-items. since items have particular ordering, i'm considering these 2 options model data:

enter image description here

now want create query retrieve 2 levels of items given userid. aql first attempt:

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

the query works , outputs result this:

[   {     "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": []   } ] 

which fine, feel query unnecessarily complex such simple traversal. me create better one, please?

the point in using graph database utilize graph querying capabilities letting handle edges, , not on own manually joining edges.

i demonstrate pattern matching traversals such query; handle transision on edges (_from , _to) transparently under hood you.

first create graph configure edge relations, use anonymous graph simplicity. have edge collection board , vertex collections user , item.

first let run whole query feeling how works, , inspect full result:

for v, e, p in 1..3 outbound 'user/andy' board return {v: v, e: e, p: p} 

you see need specify start node, , edge collection board, find vertex collections query on own inspecting edges.

now may add filters omit edges , vertices don't like:

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} 

the example contains 2 filter instructions; 1 matching each edge have title attribute being equal "item 2", other matching first edge in traversal has contain title "item 1".

finaly use document manipulation parts of documents like:

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}