2017-05-06 133 views
0

我找到了一個「朋友的朋友」遍歷查詢,它滿足了我朋友朋友的基本需求(friends of friend Query in ArangoDB 3.0)。我已經修改了它稍微使之與文檔中找到「的Knows_Graph」比如工作,我已經添加了一些額外的人(https://docs.arangodb.com/3.1/Manual/Graphs/圖 - 顯示朋友(和第一學位朋友)的朋友

enter image description here

我的查詢使用戴夫爲出發點,並查找他的第二學位朋友通過鮑勃和露西。該腳本工作正常,但我也希望它包括第一學位的朋友(鮑勃和露西)的查詢結果。我可以通過將最小深度設置爲1來完成此操作,但是如果我這樣做,我不會區分Bob和Lucy的深度(請參閱json輸出),所以我無法告訴一個更大的圖,誰是第二度

示例代碼爲2

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

分鐘深度的示例使用「知道」邊緣收集和「人」收集

這裏是JSON輸出,如果我有一分鐘深度爲1,最大深度爲2.正如你可以看到bob和lucy與其他人一樣顯示在同一個集合層。我想找到一種方法來以某種方式將它們顯示爲第一級,而不會使查詢過度複雜化或導致性能問題。

[ 
    { 
    "_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 }) 

輸出應該是這樣的:

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

如果你婉組的每個深度的朋友一起查詢可能看起來像:

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

UPDATE

如果您需要更多關於人與人之間關係的信息,您可以返回路徑而不是頂點。路徑(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

感謝您的回答。不幸的是,我的圖形圖像最初並沒有顯示「亨利」是露西的二級朋友。我已經更新了原始圖像。我想知道2件事。隨着你的查詢,它顯示了我的深度,這很棒,但是我怎麼能顯示哪些朋友屬於Bob,哪些朋友屬於Lucy?其次,Eve是Bob和Lucy的第二學位朋友。無論如何表明這一點?基本上我想展示所有的二級好友,但是向正在請求的用戶展示他們有哪些共同的好朋友(有時它會像上面那樣多) – Dkong

+1

我更新了我的答案。 – mpv1989

+0

謝謝。這給了我一個很好的方向。 – Dkong