2016-07-13 7 views
0

neo4j에서오고 Arango에서 새로 왔습니다.AQL Arango - 가장자리를 사용하여 꼭지점과 이웃을 얻으십시오.

내 데이터를 쿼리하고 해당 데이터 구조를 만들려고합니다.

Circle A 
    /  \ 
Square A Circle B 
      / \   \ 
     Circle C Square B Square D 

서클이 문서 컬렉션에 저장됩니다

그래서 내가 좋아하는 뭔가가있다. 사각형은 문서 컬렉션에 저장됩니다.

그런 다음 적절하게 대응하는 두 개의 가장자리 모음 HAS_CIRCLE 및 HAS_SQUARE가 있습니다.

나는 서클 B와 그 중력을 원한다는 것을 안다.

{ 
    circle: {data from Circle B}, 
    parents: [{data from Circle A}], 
    children: [{data from Circle C}], 
    squares: [{data from Square B}, {data from Square D}] 
} 

* 또한이 구조를 중첩 시키려고하지 않습니다. {Circle A의 데이터}를 parents에 넣고 싶을 때처럼, 나는 부모, 자녀, 사각형이 있다는 것을 기대하지 않습니다. 문자 그대로 노드에 포함 된 메타 데이터를 찾고 있습니다.

나는 이렇게 시작할 수 있음을 알고있다. 그러나 나는 빨리 길을 잃는다. 기본을 수행 할 때도 올바르게 수집하여 배열에 키와 연관시킬 수 없습니다.

FOR c in Circle 
    FILTER c.name === 'Circle B' 
    FOR hc in HAS_CIRCLE 
     FILTER hc._from === c._id 

답변

2

너는 놓친 the trip to the graph documentation in ArangoDB이어야합니다. 당신이 시도했던 것과 같은 고전적인 조인으로 문서 질의를 사용하여 그래프 반복을 수행하고 다른 RDBMS의 전통적인 SQL 에서처럼 그렇게 매핑 할 수 있는지 확인하십시오.

그러나 ArangoDB이 같은 쿼리에서 당신이 경우 use the pattern matching traversals 그 실제 그래프 힘을 발표 :

FOR vertex, edge, path IN 
    1..5 
    OUTBOUND 
    'circle/A' 
    GRAPH circesAndSquares 
    FILTER edge.name == 'Circle B' 
    RETURN {vertices: vertex, edges: edge, paths: path} 

edge 현재 탐색 단계의 가장자리 문서, vertex 정점이 포함됩니다. FILTER을 입력하면 RETURN 문과 일치하지 않는 문서가 숨겨집니다. 이름으로 문서에

FILTER path.vertices[*].isValid == true 

예제는 하우투 작업을 보여줍니다

FILTER path.edges[1].name == 'Circle B' 

또한 어떤 반복 깊이 필터링 할 수 있습니다 : 경로는 다음 학기에 통과를 중단 할 수 있습니다 반복 깊이에 필터링 할 수 있습니다 익명의 그래프와 howto는 ArangoDB에 데이터를 삽입합니다. ArangoDB는 _from_to 속성을 암시 적으로 알고 가장자리 문서에 적용하는 특수한 edge collection type을 가지고 있습니다. 그러나이 제한 외에도 임의의 문서로 채울 수 있습니다.

combine regular AQL queries with graph traversals, as demonstrated in this example 수 있습니다.

+1

감사합니다. 이에 대한 나의 최종 접근법을 아래에 추가했습니다. – savv

+0

안녕하세요, 귀하의 솔루션을 '수락'으로 표시해야합니다 ;-) – dothebart

1

덕분에 @dothebart 덕분에 - 이것이 나를 올바른 방향으로 안내해주었습니다.

내 검색어가 좋아졌습니다. 여전히 가장 이상적이지만 100 % 찾고 있지 않은 결과를 얻었습니다.

FOR c IN Circle 
    FILTER c.name == 'Circle B' 
     RETURN { 
      "circle" : c, 
      "parents": (FOR parents IN INBOUND b._id HAS_CIRCLE RETURN parents)), 
      "children": (FOR children IN OUTBOUND b._id HAS_CIRCLE RETURN children), 
      "squares": (FOR squares IN OUTBOUND b._id HAS_SQUARE RETURN squares) 
     }