2017-05-06 5 views
0

친구 (친구 번호 : friends of friend Query in ArangoDB 3.0)를 얻는 데 필요한 기본 요구 사항을 충족하는 "친구의 친구"탐색 쿼리를 발견했습니다. 나는 그것이 약간은 문서에서 발견는 "Knows_Graph"예를 함께 작동하도록 수정하고 난 몇 가지 여분의 명 (https://docs.arangodb.com/3.1/Manual/Graphs/)그래프 - 친구 (및 1도 일반 친구)의 친구 표시

enter image description here

내 쿼리가 출발점으로 데이브을 사용하고 찾습니다를 추가했습니다 밥 (Bob)과 루시 (Lucy)를 통해 2 학년 친구. 스크립트는 잘 작동하지만 쿼리 결과에 1 차 친구 (bob 및 lucy)가 포함되기를 원합니다. 최소 깊이를 1로 설정하면됩니다. 그러나 그렇게하면 Bob과 Lucy의 깊이를 구분하지 않으므로 (json 출력 참조) 더 큰 그래프를 1 단계로 말할 수 없을 것입니다. I는 최소가 있다면 누가 샘플이 사용

샘플 코드 2

LET person = DOCUMENT("persons/@persons/dave") 
LET foaf = (
    FOR v IN 2..2 ANY person knows  
    RETURN v 
) 
RETURN MERGE(person, { foaf }) 

분의 깊이의 2 정도를 인 에지 수집 및 "사용자"컬렉션을 "인식"여기

는 JSON 출력 인 1의 깊이와 2의 최대 깊이를 볼 수 있습니다. 보브와 루시는 다른 컬렉션과 동일한 컬렉션 레벨에 표시됩니다. 어떻게 든 쿼리를 복잡하게하거나 성능 문제를 일으키는 일없이 제 1 레벨로 표시 할 수있는 방법을 찾고 싶습니다.

[ 
    { 
    "_id": "persons/dave", 
    "_key": "dave", 
    "_rev": "_U7wRsJG--_", 
    "name": "Dave", 
    "foaf": [ 
     { 
     "_key": "lucy", 
     "_id": "persons/lucy", 
     "_rev": "_U8--wPq---", 
     "name": "Lucy" 
     }, 
     { 
     "_key": "henry", 
     "_id": "persons/henry", 
     "_rev": "_U8-_FNa---", 
     "name": "Henry" 
     }, 
     { 
     "_key": "bob", 
     "_id": "persons/bob", 
     "_rev": "_U7wRsJC--_", 
     "name": "Bob" 
     }, 
     { 
     "_key": "charlie", 
     "_id": "persons/charlie", 
     "_rev": "_U7wRsJG---", 
     "name": "Charlie" 
     }, 
     { 
     "_key": "alice", 
     "_id": "persons/alice", 
     "_rev": "_U7wRsJC---", 
     "name": "Alice" 
     }, 
     { 
     "_key": "eve", 
     "_id": "persons/eve", 
     "_rev": "_U7wRsJG--A", 
     "name": "Eve" 
     } 
    ] 
    } 
] 

답변

2

다음 쿼리를 사용하면 모든 친구들에 대한 깊이 정보를 얻을 수 있습니다.

LET person = DOCUMENT("persons/@persons/dave") 
LET foaf = (
    FOR v, e, p IN 1..2 ANY person knows  
    RETURN {v, depth: LENGTH(p.edges)} 
) 
RETURN MERGE(person, { foaf }) 

출력은 같아야합니다 :

LET person = DOCUMENT("persons/@persons/dave") 
LET foaf = (
    FOR v, e, p IN 1..2 ANY person knows  
    COLLECT depth = LENGTH(p.edges) INTO s KEEP v 
    RETURN {depth, foaf: s[*].v} 
) 
RETURN MERGE(person, { foaf }) 

출력은 같아야합니다 : 당신이 좋아하는 모든 깊이의 친구가 함께 쿼리에 볼 수 있었다 그룹에 완 경우

[ 
    { 
    "_id": "persons/dave", 
    "_key": "dave", 
    "_rev": "_U8e0Ube---", 
    "foaf": [ 
     { 
     "v": { 
      "_key": "lucy", 
      "_id": "persons/lucy", 
      "_rev": "_U8e0Y2u---" 
     }, 
     "depth": 1 
     }, 
     { 
     "v": { 
      "_key": "bob", 
      "_id": "persons/bob", 
      "_rev": "_U8ezwCm---" 
     }, 
     "depth": 1 
     }, 
     { 
     "v": { 
      "_key": "charlie", 
      "_id": "persons/charlie", 
      "_rev": "_U8e0-Oe---" 
     }, 
     "depth": 2 
     }, 
     { 
     "v": { 
      "_key": "eve", 
      "_id": "persons/eve", 
      "_rev": "_U8e0loy---" 
     }, 
     "depth": 2 
     }, 
     { 
     "v": { 
      "_key": "alice", 
      "_id": "persons/alice", 
      "_rev": "_U8e0ptu---" 
     }, 
     "depth": 2 
     } 
    ] 
    } 
] 

:

[ 
    { 
    "_id": "persons/dave", 
    "_key": "dave", 
    "_rev": "_U8e0Ube---", 
    "foaf": [ 
     { 
     "depth": 1, 
     "foaf": [ 
      { 
      "_key": "lucy", 
      "_id": "persons/lucy", 
      "_rev": "_U8e0Y2u---" 
      }, 
      { 
      "_key": "bob", 
      "_id": "persons/bob", 
      "_rev": "_U8ezwCm---" 
      } 
     ] 
     }, 
     { 
     "depth": 2, 
     "foaf": [ 
      { 
      "_key": "charlie", 
      "_id": "persons/charlie", 
      "_rev": "_U8e0-Oe---" 
      }, 
      { 
      "_key": "eve", 
      "_id": "persons/eve", 
      "_rev": "_U8e0loy---" 
      }, 
      { 
      "_key": "alice", 
      "_id": "persons/alice", 
      "_rev": "_U8e0ptu---" 
      } 
     ] 
     } 
    ] 
    } 
] 

업데이트

사람들 사이의 관계에 대한 자세한 정보가 필요하면 꼭지점 대신 경로를 반환 할 수 있습니다. 경로 (p)에는 방문한 모든 에지 (관계를 알고 있음)와 모든 꼭지점 (사람)이 포함됩니다. AQL 통과 구문에 대한 자세한 내용은 docs을 참조하십시오.

LET person = DOCUMENT("persons/@persons/dave") 
LET foaf = (
    FOR v, e, p IN 1..2 ANY person knows  
    COLLECT depth = LENGTH(p.edges) INTO s KEEP p 
    RETURN {depth, foaf: s[*].p} 
) 
RETURN MERGE(person, { foaf }) 
+0

답장을 보내 주셔서 감사합니다. 불행히도 내 그래프 이미지는 원래 Lucy의 2 학년 친구 인 "Henry"를 보여주지 않았습니다. 원본 이미지를 업데이트했습니다. 나는 2 가지를 궁금해하고있다. 귀하의 질의를 통해 깊이가 어느 정도인지를 보여줍니다. 그러나 어떤 친구가 Bob에게 속하고 어떤 친구가 Lucy에 속 하는지를 어떻게 표시 할 수 있습니까? 둘째, Eve는 Bob과 Lucy를 통해 2 학년 친구입니다. 어쨌든 이것을 보여줄 수 있습니까? 기본적으로 나는 2 학년 친구들을 모두 보여주고 싶지만 요청하는 사용자들에게 공통점이있는 1 학년 친구들을 보여주고 싶습니다. (그리고 때로는 위에있는 것 이상이 될 수도 있습니다) – Dkong

+1

나는 내 대답을 업데이트했습니다. – mpv1989

+0

감사합니다. 이것은 나에게 좋은 방향을 제공합니다. – Dkong