2017-02-20 2 views
0

私は今日新しいプロジェクトを開始しました。私はグラフの結果のためにユーザーテーブル、タグテーブルとuser_tagsエッジを持っています。ArangoDBで最も類似したエントリーを持つユーザーを表示するには

私はグラフにいくつかのタグをユーザーに付けました。どのようにしてArangoDBでもっとも類似したエントリを持つユーザをリストアップできますか?例えば

  • ユーザーID:
  • ユーザID 52、53、:113 5個のタグ(タグIDを有する:112 3個のタグ(50、51、52、53タグID)を有しています54、55、56)
  • ユーザID:51、52、53、54)
  • ユーザーID:48、49)
:115は2個のタグ(タグIDを持つ114は、4個のタグ(タグIDを有します

私はユーザーID 112ユーザーを検索しました。結果は、このようになります。

  1. ユーザーID:114(3つのマッチ、51、52、53)
  2. ユーザーID:113(2試合、52、53)

非-commonのデータが結果に含まれないようにしてください ユーザーID:115

誰もがarangodb解を知っていない場合は、neo4jの解がある場合はneo4jを使用できます。

ありがとうございました。 CYPHERで

答えて

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 

乾杯ArangoDBで

+0

これらのサイファーの結果には、現在のユーザーが含まれます。だから私はあなたの例のためにu.id <> user_id < - 114を追加しました。ありがとう! – fourfourtwo

0

、このクエリは長い間、あなたが頂点のコレクションとして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) 
    } 

これはおそらく重く最適化することができますが、このように分割すると簡単になりました理解する。

関連する問題