检索/存储Freebase中的所有相关Actors

时间:2013-11-22 01:49:50

标签: php mysql sql api freebase

我正在努力做一些(应该)非常简单的事情。也许我错过了什么。

我希望获得一个人合作过的完整列表。我的最终目标是找到他最常与谁合作(无论可能是什么样的关系)

Ex:Robert De Niro曾与Joe Pesci共同演过7次,但指导了他两次。我想要一个包含9个条目的表。

我可以使用主题API,但只返回电影列表。然后,我必须执行10个以上的API查询才能获得每部电影的演员表。永远需要,代码是一场噩梦。

如果我使用MQL搜索,我只能搜索Robert De Niro加注的电影,但不能搜索他导演,编写或制作的每部电影已加星标。基本上我一次只能搜索1个角色。

有更好的方法吗?我需要得到一个清单:

Movies

Actors/Crew People

Roles关联MoviesPeople

我目前所做的事情:

  • 搜索Robert De Niro并获取计算机ID
  • 主题搜索该MID,返回他已经处理过的电影MID列表
  • 主题搜索每部电影MID,并记录像directed_by,starring,generated_by等字段

正如您所看到的,这是一项非常昂贵的操作。以这种方式避免重复是非常困难的(虽然我正在研究它)

编辑:这是我当前的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'
                        ));

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"}]

2 个答案:

答案 0 :(得分:2)

您可以在单个MQL查询中执行此操作,该查询具有针对定向/写入/作用属性的不同子查询。只需确保使每个子查询可选。

例如:

[{
  "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"
}]

答案 1 :(得分:-1)

我不知道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