簡體   English   中英

如何使用ArangoDB列出條目最相似的用戶

[英]How can I list the users with the most similar entries with ArangoDB

我今天開始新項目。 我有用戶表,標簽表和user_tags邊緣的圖形結果。

我在圖形上附加了一些標簽給用戶。 如何列出與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。

謝謝。

在cypher中,這是查詢:

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

干杯

在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)
    }

可能可以對其進行大量優化,但是像這樣將其分解會使它更易於理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM