2017-02-20 16 views
0

我今天開始了一個新項目。我有圖表結果的用戶表,標籤表和user_tags邊緣。我如何列出ArangoDB中最相似條目的用戶

我附加給用戶一些圖上的標籤。我如何列出與ArangoDB最相似的條目的用戶。

例如:

  • 用戶ID:112具有3個標籤(標籤的ID:50,51,52,53)
  • 用戶ID:113具有5個標籤(標籤的ID:52,53, 54,55,56)
  • 用戶ID:114具有4個標籤(標籤的ID:51,52,53,54)
  • 用戶ID:115具有2個標籤(標籤的ID:48,49)

當我搜索用戶ID 112用戶。結果應該與此類似:

  1. 用戶ID:114(3個匹配,51,52,53)
  2. 用戶ID:113(2個匹配,52,53)

非 - 共同的數據不應該在結果 用戶ID:115

如果沒有人知道arangodb解決方案,我可以使用neo4j,如果有neo4j的解決方案。

謝謝。

回答

0

在暗號,這是查詢:

MATCH (u1:User {id:114})-[:HAS_TAG]->(tag:Tag), 
     (u:User)-[:HAS_TAG]->(tag:Tag) 
WITH u, collect(id(tag)) AS tags 
RETURN u, tags, size(tags) AS score 
ORDER BY score DESC 

乾杯

+0

這些密碼結果包括當前用戶。所以我爲你的例子添加了WHERE u.id <> user_id < - 114。謝謝! – fourfourtwo

0

在ArangoDB,該查詢工作,只要您創建userstags爲頂點的集合圖形,並user_tags作爲你的邊緣集合:

LET active_user = FIRST(
    FOR u IN users 
    FILTER u.id == @user_id 
    RETURN u._id 
) 

LET active_tags = (
    FOR v IN 1..10 OUTBOUND active_user GRAPH 'user_tags_graph' 
    RETURN (v.id) 
) 

FOR u IN users 
FILTER u._id != active_user 
    LET tags_in_use = FLATTEN(
     FOR v IN 1..10 OUTBOUND u._id GRAPH 'user_tags_graph' 
     RETURN [v.id] 
    ) 
    LET tag_matches = (
     RETURN LENGTH(INTERSECTION(active_tags, tags_in_use)) 
    ) 
    FILTER FIRST(tag_matches) > 0 
    SORT tag_matches DESC 
    RETURN { 
     [u.id]: INTERSECTION(active_tags, tags_in_use) 
    } 

它可能會被大量優化,但這樣做會更容易瞭解。

相關問題