2016-10-14 1 views
3

Ich spiele mit TinkerPop und ich bekomme meinen Kopf fest um dieses Problem: Ich würde gerne alle Schauspieler aus den Filmen finden, die ALLE meine Freunde mochten (in anderen Worten, finden die gemeinsamen Filme, die meine Freunde die Namen aller Beteiligten gefallen haben und erhalten, die in diesen Filmen gespielt)Holen Sie sich alle Schauspieler, die in einem Film gespielt haben, die alle meine Freunde mochten

so weit, was ich versuchte:

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

gibt alle Akteure, die in gespielt ein Film, den mindestens EINER meiner Freunde mochte. Ich bin ziemlich neu in TinkerPop und die riesige API verwirrt mich irgendwie.

Danke!

Antwort

4

Wie immer, lassen Sie sich mit einer Probe Graph starten:

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() 

Wie Sie bereits sehen können, nur movie 2 wurde von allen Freunden von user 1 mag. Die Traversal die Frage zu beantworten folgt (mit Kommentaren inline):

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] 

Nun, wenn Sie die Schauspieler Namen erhalten möchten, müssen Sie nur anhängen müssen:

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

Thank you very much! Ich dachte über das Zählen nach, konnte aber nicht herausfinden, wie man eine solche Frage schreibt! Es sieht sehr vielversprechend für das aus, was ich vorhabe! Letzte Sache, siehst du irgendeinen Grund, solche Abfrage nicht zu machen, Leistung weise? –

+0

Ziemlich viel hängt von Ihrem Diagramm ab. Wenn es Nutzer mit vielen Freunden (Tausende +) oder viele Likes gibt, werden Sie wahrscheinlich keine Echtzeitergebnisse erhalten. In diesem Fall können Sie jedoch Abkürzungskanten vorberechnen, aber das ist ein anderes Thema. –

Verwandte Themen