2016-10-14 2 views
3

Я играю с TinkerPop, и я заставляю голову зависеть от этой проблемы: мне хотелось бы найти всех актеров из фильмов, которые понравились всем моим друзьям (другими словами, найти общие фильмы, которые мои друзья любили и получить имя всех актеров, которые играли в этих фильмах)Получите всех актеров, которые играли в кино, которые понравились всем моим друзьям

до сих пор, что я пробовал:

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

возвращает все актеры, которые играли в фильм, который понравился хотя бы ОДИН из моих друзей. Я совершенно новичок в 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 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") 
+0

Большое спасибо! Я думал о подсчете, но не мог понять, как написать такой запрос! Это выглядит очень многообещающе для того, что я планирую делать! Последнее, видите ли, по какой-либо причине не делать такой запрос, производительность мудрая? –

+0

В значительной степени зависит от вашего графика. Если есть пользователи с большим количеством друзей (тысячи +) или много понравившихся, то вы, вероятно, не сможете получить результаты в режиме реального времени. Тем не менее, в этом случае вы можете предварительно рассчитать краткие сокращения, но это еще одна тема. –

Смежные вопросы