2016-06-07 7 views
0

그래프에서 사용자는 많은 항목에 연결되어 있고 각 항목은 많은 하위 항목으로 재귀 적으로 나눌 수 있습니다. 내 항목이 특정 순서를 가지고 있기 때문에, 나는 내 데이터를 모델링하는 두 가지 옵션을 고려하고 있습니다 :AQL 쿼리를 개선하기위한 아이디어

enter image description here

가 지금은 주어진 사용자 ID에 대한 항목이 두 가지 수준의 검색 쿼리를 만들려고합니다. 이 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의 추가 할 수 있습니다 :

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"을 포함해야하는 것과 일치하는 각 에지와 일치합니다.

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

마침내 우리 use document manipulation는 우리가 좋아하는 문서의 부분을 얻기 위해