2016-10-14 3 views
3

私はTinkerPopで遊んでいます。私はこの問題を抱えています。私の友人が好きな映画のすべての俳優を探していますつまり、これまでのところ、私が試したものを私の友人が好きな映画で演奏したすべての俳優を入手してください

に)私の友人が好きで、それらの映画の中で再生されるすべての俳優の名前を取得する一般的な映画を見つける:

g.V(v1).out("friend").out("like").in("play_in").values("name") 

リターンをで演奏すべての俳優少なくとも私の友人の1人が好きだった映画。私はTinkerPopにはかなり新しく、膨大なAPIが何とか私を混乱させます。

ありがとうございます!

答えて

4

いつものように、のは、サンプルのグラフから始めましょう:あなたは既に見ることができるように

g = TinkerGraph.open().traversal() 
g.addV(id, "user 1").as("u1"). 
    addV(id, "user 2").as("u2"). 
    addV(id, "user 3").as("u3"). 
    addV(id, "movie 1").as("m1"). 
    addV(id, "movie 2").as("m2"). 
    addV(id, "movie 3").as("m3"). 
    addE("friend").from("u1").to("u2"). 
    addE("friend").from("u1").to("u3"). 
    addE("like").from("u2").to("m1"). 
    addE("like").from("u2").to("m2"). 
    addE("like").from("u3").to("m2"). 
    addE("like").from("u3").to("m3").iterate() 

、唯一movie 2user 1のすべての友達からも好かれました。質問に答えるトラバーサルは(コメントをインラインで)、以下:

gremlin> g.V("user 1").            /* start at user 1      */ 
      out("friend").aggregate("friends").      /* collect all his friends    */ 
      out("like").dedup().          /* traverse to all the movies they liked */ 
      filter(
      __.in("like").where(within("friends")).count().as("a"). /* count the number of friends who liked the movie */ 
      select("friends").count(local).where(eq("a"))   /* compare to the number of total friends and  */ 
      )               /* filter, if the counts don't match    */ 
==>v[movie 2] 

を今、あなたは俳優の名前を取得したい場合は、あなただけ追加する必要があります:

.in("play_in").dedup().values("name") 
+0

はどうもありがとうございました!私は数えることを考えましたが、そのようなクエリを書く方法を理解できませんでした!私は何をしようとしているのか非常に有望です!最後のことは、パフォーマンスの賢明なクエリを実行しない理由を参照してくださいか? –

+0

かなりあなたのグラフに依存します。多くの友人(千人以上)または好きな人がたくさんいる場合、おそらくリアルタイムの結果を得ることはできません。しかし、この場合、ショートカットのエッジをあらかじめ計算することができますが、これは別のトピックです。 –

関連する問題