Получение / хранение всех связанных актеров в Freebase

Я пытаюсь сделать что-то, что (должно быть) очень просто. Может быть, я что-то упустил.

Я хочу получить полный список людей, с которыми работал человек. Моя конечная цель – найти, с кем он работает чаще всего (в любых отношениях, которые могут быть)

Пример: Robert De Niro действовал вместе с Джо Пески 7 раз, но направил его дважды. В результате я хочу получить таблицу из 9 записей.

Я могу использовать тему API, но это только возвращает список фильмов. Затем я должен выполнить 10+ запросов API, чтобы получить бросок каждого фильма. Принимает навсегда, а код – кошмар.

Если я использую поиск в MQL, я могу только искать фильмы, в которых снимался Robert De Niro , но не каждый фильм, который он направил, или написал, или продюсировал, или сыграл главную роль. В основном я могу искать только по одной роли за раз.

Есть ли способ лучше? Мне нужно составить список:

Movies

Actors/Crew People

Roles связанные с Movies и People

Что я сейчас делаю:

  • Найдите Robert De Niro и получите идентификатор машины
  • Сделайте поиск по темам для этого MID, возвращая список MID фильмов, над которыми он работал
  • Сделайте поиск по темам для каждого фильма MID и запишите поля, такие как direct_by, в главной роли, created_by и т. Д.

Как вы видите, это очень дорогостоящая операция. Это также чрезвычайно сложно избежать дубликатов таким образом (хотя я над этим работаю)

edit: Вот мой текущий запрос MQL (по какой-то причине он работает только в том случае, если я также укажу два имени актера, но это еще одна проблема.

 $query = array(array( 'a:starring'=>array('actor'=>'Joe Pesci'), 'b:starring'=>array('actor'=>'Robert De Niro'), 'directed_by'=>null, 'produced_by'=>array(), 'written_by'=>array(), 'executive_produced_by'=>array(), 'name'=>null, 'mid'=>null, 'starring'=>array(array('actor'=>array('mid'=>null, 'name'=>null))), 'type'=>'/film/film' )); в $query = array(array( 'a:starring'=>array('actor'=>'Joe Pesci'), 'b:starring'=>array('actor'=>'Robert De Niro'), 'directed_by'=>null, 'produced_by'=>array(), 'written_by'=>array(), 'executive_produced_by'=>array(), 'name'=>null, 'mid'=>null, 'starring'=>array(array('actor'=>array('mid'=>null, 'name'=>null))), 'type'=>'/film/film' )); 

MQL:

  [{ "a:starring": {"actor":"Joe Pesci"}, "b:starring": {"actor":"Robert De Niro"}, "directed_by":null, "produced_by":[], "written_by":[], "executive_produced_by":[], "name":null, "mid":null, "starring": [{"actor": {"mid":null,"name":null}}], "type":"\/film\/film"}] в  [{ "a:starring": {"actor":"Joe Pesci"}, "b:starring": {"actor":"Robert De Niro"}, "directed_by":null, "produced_by":[], "written_by":[], "executive_produced_by":[], "name":null, "mid":null, "starring": [{"actor": {"mid":null,"name":null}}], "type":"\/film\/film"}] в  [{ "a:starring": {"actor":"Joe Pesci"}, "b:starring": {"actor":"Robert De Niro"}, "directed_by":null, "produced_by":[], "written_by":[], "executive_produced_by":[], "name":null, "mid":null, "starring": [{"actor": {"mid":null,"name":null}}], "type":"\/film\/film"}] 

Вы можете сделать это все в одном запросе MQL с различными подзапросами для свойств direct / written / acted. Просто убедитесь, что вы делаете каждый подзапрос необязательным.

Например:

 [{ "a:starring": { "actor": "Joe Pesci" }, "b:starring": { "actor": "Robert De Niro" }, "directed_by": [{ "id": null, "name": null, "optional": true }], "produced_by": [{ "id": null, "name": null, "optional": true }], "written_by": [{ "id": null, "name": null, "optional": true }], "executive_produced_by": [{ "id": null, "name": null, "optional": true }], "name": null, "mid": null, "starring": [{ "actor": { "mid": null, "name": null } }], "type": "/film/film" }] 

Я не знаю MQL, но стандартный SQL был бы таким:

 Select p.Name + ' has worked with '+p2.name+' on the movie '+m.Name from Person p join Roles r on r.PersonId=p.Id join Movie m on m.Id=r.MovieId join Roles r2 on r.MovieId=m.Id and r2.Id <> r.Id join Person p2 on p2.Id=r2.PersonId