获取我所有朋友都喜欢的电影中扮演的所有演员

Get all the actors that played in a movie that all my friends liked

我正在玩 TinkerPop,但我一直被这个问题困扰:我想找到我所有朋友都喜欢的电影中的所有演员(换句话说,找到我朋友喜欢的普通电影并获取在这些电影中扮演的所有演员的名字)

到目前为止我尝试了什么:

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

returns 至少有一个朋友喜欢的电影中的所有演员。我对 TinkerPop 很陌生,庞大的 API 让我不知何故感到困惑。

谢谢!

一如既往,让我们从示例图开始:

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