2015-10-02 20 views
5

NEO4jを使用してグラフを作成していますが、現在はテキストベースの検索より優れたシンプルな推奨システムを構築しようとしています。グラフDBがNeo4jのサイファーで次善策推奨ノードを取得

役割がある

People - [:role] -> Album :アーティスト、プロデューサー、ソングライターは、(タイプは

Album-[:is_a_type_of]->Typeある

アルバム、人、タイプ、などとして作成され

関係をチャート:

ノードは、このようなとして作成されています基本的にはポップ、ロック、ディスコなど)

People -[:POPULAR_ON]->Chart(これらはチャートであったかもしれません)

People -[:SIMILAR_TO]->People(所定の類似の接続)

Iは、以下のCYPHER書かれている:それはしかし、動作

MATCH (a:Album { id: { id } })-[:is_a_type_of]->(t)<-[:is_a_type_of]-(recommend)  
    WITH recommend, t, a 
    MATCH (recommend)<-[:ARTIST_OF]-(p) 
    OPTIONAL MATCH (p)-[:POPULAR_ON]->() 
    RETURN recommend, count(DISTINCT t) AS type 
    ORDER BY type DESC 
    LIMIT 25; 

をそれに接続された音楽の一種類のみを有する場合、それは容易に、繰り返さ従って有します同じ隣人。

言うことを示唆方法があります:

  • は私から始まるアルバムに最も類似した接続関係を持って次のベストアルバムを探すには。
  • タイブレーカーのシナリオに関する推奨事項はありますか?今はタイプ別です(アルバムに複数のタイプの音楽がある場合はそれ以上の価値がありますが、誰も同じ数字を持っていれば、それ以上はありません)
  • -I [:SIMILAR_TO]リンクを作った[:Popular_On](?たぶん、この関係をドロップ)

答えて

1

あなたは4を使用することができ、重要なとしてその関係を考慮することの優先順位を強制するために、私はそれに取り組んでCYPHERを持っていなかった

  • -Sameはのために行きます設定し、アルバムをこの順番でより高い価値に応じて注文します。設定を0〜1(例:0.6)のままにする

    a. People Popular on Chart and People are similar 
    b. People Popular on Chart and People are Not similar 
    c. People Not Popular on Chart and People are similar 
    d. People Not Popular on Chart and People are Not similar 
    

    これらの4つの値を計算し、各アルバムで合計します。値が高いほど、推奨アルバムが高くなります。

    私は一時的にa = 1、b = 0.8、c = 0.6、d = 0.4として設定しました。そしてPeople Likes Albumを示唆する何らかの関係を前提とした。 Chartのみに基づいてロジックを作成する場合は、&bのみを使用します。

    MATCH (me:People) 
    where id(me) = 123 
    MATCH (a:Album { id: 456 })-[:is_a_type_of]->(t:Type)<-[:is_a_type_of]-(recommend)  
    OPTIONAL MATCH (recommend)<-[:ARTIST_OF]-(a:People)-[:POPULAR_ON]->(:Chart) 
    WHERE exists((me)-[:SIMILAR_TO]->(a)) 
    OPTIONAL MATCH (recommend)<-[:ARTIST_OF]-(b:People)-[:POPULAR_ON]->(:Chart) 
    WHERE NOT exists((me)-[:SIMILAR_TO]->(b)) 
    OPTIONAL MATCH (recommend)<-[:LIKES]-(c:People) 
    WHERE exists((me)-[:SIMILAR_TO]->(a)) 
    OPTIONAL MATCH (recommend)<-[:LIKES]-(d:People) 
    WHERE NOT exists((me)-[:SIMILAR_TO]->(a)) 
    RETURN recommend, (count(a)*1 + count(b)*0.8 + count(c)* 0.6+count(d)*0.4) as rec_order 
    ORDER BY rec_order DESC 
    LIMIT 10; 
    
  • +0

    私はあなたのロジックを理解していますが、グラフの種類を参考にして構成と計算で+を意味するものも理解できません。 – azngunit81

    +0

    @ azngunit81:必要に応じて擬似サイファーを使って説明してください。 –

    +0

    2つの質問:1)あなたは何を意味するのですか?この体重ですか? 2)人々はあなたを意味しません。人々はアーティスト、プロデューサー、作曲家などを意味します(私の質問で説明した通り) – azngunit81

    関連する問題