2

我正在尝试从 Freebase 获取结果列表。我有一组 MID。有人可以解释我将如何构造查询并将其传递给 PHP 中的 API 吗?

我是 MQL 新手 - 我什至无法让示例工作:

$simplequery = array('id'=>'/topic/en/philip_k_dick', '/film/writer/film'=>array());
$jsonquerystr = json_encode($simplequery);
// The Freebase API requires a query envelope (which allows you to run multiple queries simultaneously) so we need to wrap our original, simplequery structure in two more arrays before we can pass it to the API:
$queryarray = array('q1'=>array('query'=>$simplequery));
$jsonquerystr = json_encode($queryarray);
// To send the JSON formatted MQL query to the Freebase API use cURL:
#run the query
$apiendpoint = "http://api.freebase.com/api/service/mqlread?queries";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$apiendpoint=$jsonquerystr");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$jsonresultstr = curl_exec($ch);
curl_close($ch);
// Decoding the JSON structure back into arrays is performed using json_decode as in:
$resultarray = json_decode($jsonresultstr, true); #true:give us the json struct as an array
// Iterating over the pieces of the resultarray containing films gives us the films Philip K. Dick wrote:
$filmarray = $resultarray["q1"]["result"]["/film/writer/film"];

foreach($filmarray as $film){
    print "$film<br>";
}
4

2 回答 2

2

你做的一切都是对的。如果不是,您将在 JSON 结果中返回错误消息。

我认为发生的事情是关于菲利普·K·迪克的数据已经更新,将他认定为不是电影的“作家”,而是“电影故事的贡献者”。(毕竟,他并没有真正写过任何剧本。)

更改您的简单查询:

$simplequery = array('id'=>'/topic/en/philip_k_dick', '/film/writer/film'=>array());

至:

$simplequery = array('id'=>'/topic/en/philip_k_dick', '/film/film_story_contributor/film_story_credits'=>array());

实际上,您可以使用 Freebase 网站深入研究主题以挖掘这些信息,但这并不容易找到。在基本的 Philip K. Dick 页面 (http://www.freebase.com/view/en/philip_k_dick) 上,单击底部的“编辑并显示详细信息”按钮。

“编辑”页面 (http://www.freebase.com/edit/topic/en/philip_k_dick) 显示了与该主题相关的类型。该列表包括“电影故事贡献者”,但不包括“作家”。在此页面的电影故事贡献者区块中,有一个“详细视图”链接 (http://www.freebase.com/view/en/philip_k_dick/-/film/film_story_contributor/film_story_credits)。本质上,这就是您尝试使用 PHP 代码复制的内容。

对真正的电影作家(例如,史蒂夫马丁)进行类似的深入研究,将您带到一个名为 /film/writer/film 的属性(http://www.freebase.com/view/en/steve_martin/-/film/作家/电影)。

多个查询

您没有确切说明您要对一组 MID 执行什么操作,但触发多个查询就像在 $queryarray 中添加一个 q2、q3 等一样简单。答案将回到相同的结构中——您可以像提取 q1 数据一样提取它们。如果你打印出你的 jsonquerystr 和 jsonresultstr 你会看到发生了什么。

于 2012-05-02T17:13:32.783 回答
0

进行了一些修改以包含问题的答案,因为这对我有所帮助,我对每个人都投了赞成票,只是想我会提供一个更“完整”的答案,因为它是:

$simplequery = array('id'=>'/topic/en/philip_k_dick', '/film/film_story_contributor/film_story_credits'=>array());
$jsonquerystr = json_encode($simplequery);
// The Freebase API requires a query envelope (which allows you to run multiple queries simultaneously) so we need to wrap our original, simplequery structure in two more arrays before we can pass it to the API:
$queryarray = array('q1'=>array('query'=>$simplequery));
$jsonquerystr = json_encode($queryarray);
// To send the JSON formatted MQL query to the Freebase API use cURL:
#run the query
$apiendpoint = "http://api.freebase.com/api/service/mqlread?queries";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$apiendpoint=$jsonquerystr");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$jsonresultstr = curl_exec($ch);
curl_close($ch);
// Decoding the JSON structure back into arrays is performed using json_decode as in:
$resultarray = json_decode($jsonresultstr, true); #true:give us the json struct as an associative array
// Iterating over the pieces of the resultarray containing films gives us the films Philip K. Dick wrote:

if($resultarray['code'] == '/api/status/ok'){
    $films = $resultarray['q1']['result']['/film/film_story_contributor/film_story_credits'];
    foreach ($films as $film){
        print "$film</br>";
    }
}
于 2013-03-25T06:36:45.557 回答