我正在和TinkerPop一起玩,我正在努力解决这个问题:我想找到所有朋友都喜欢的电影中的所有演员(换句话说,找到我朋友们喜欢的普通电影并获得这些电影中扮演的所有演员的名字)
到目前为止,我尝试过:
g.V(v1).out("friend").out("like").in("play_in").values("name")
返回在电影中播放的所有演员,至少有一个朋友喜欢。我对TinkerPop很新,而且庞大的API让我感到困惑。
谢谢!
答案 0 :(得分: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 2
的所有朋友都只有user 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")