Я пытаюсь получить список результатов из Freebase. У меня есть массив MID. Может кто-нибудь объяснить, как я буду структурировать запрос и передать его API в PHP?
Я новичок в 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>"; }
Вы все делаете правильно. Если вы этого не сделали, вы получите обратные сообщения об ошибках в результатах JSON.
Я думаю, что произошло то, что данные о Филиппе Дике были обновлены, чтобы идентифицировать его не как «писателя» фильмов, а как «film_story_contributor». (В конце концов, он не написал ни одного сценария.)
Измените свой вопрос:
$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 для детализации тем, чтобы выкопать эту информацию, но ее не так-то просто найти. На основной странице Филиппа К. Дика (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, но запуск нескольких запросов так же просто, как добавление q2, q3 и т. Д., Все внутри $ queryarray. Ответы возвращаются внутри одной структуры – вы можете вытащить их так же, как вы вытаскиваете данные q1. Если вы распечатаете свои jsonquerystr и jsonresultstr, вы увидите, что происходит.
Изменено немного, чтобы включить ответ на вопрос, так как это помогло мне, я поддержал каждого, просто подумал, что я бы предоставил более «полный» ответ, как бы:
$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>"; } }