我正在尝试做一些(应该)非常简单的事情。也许我错过了什么。
我想得到一个人共事过的人的完整名单。我的最终目标是找到他最经常合作的人(无论是什么关系)
前:Robert De Niro
曾与乔·佩西合作过7次,但导演过两次。因此,我想要一个有9个条目的表。
我可以使用主题API,但它只返回电影列表。然后,我必须执行10+API查询,以获得每部电影的演员阵容。花了很长时间,代码简直是噩梦。
如果我使用MQL搜索,我只能搜索Robert De Niro
主演过的电影,但不能搜索他执导、编剧或制作过的每一部电影,或主演过的电影。基本上,我一次只能搜索一个角色。
有更好的方法吗?我需要最后列出一个列表:
Movies
Actors/Crew People
Roles
连接Movies
和People
我目前的工作:
- 搜索
Robert De Niro
并获取机器ID - 对该MID进行主题搜索,返回他制作过的电影MID列表
- 对每个电影MID进行主题搜索,并记录directed_by、staying、produced_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'
));
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"}]
您可以在一个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"
}]
我不知道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