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:
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 filter
s 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}