Примечание: Этот текст был предоставлен @IrinaM, но поставлен под вопрос как редакция из-за восьмичасового ограничения. Сейчас гораздо позже, и предложение о том, что @IrinaM в качестве ответа не было принято. Вот слегка отредактированный CW-ответ, содержащий этот текст.
В коде есть несколько ошибок в вопросе.
Запрос 2 nd (тот, который не «работал») вернул бы несколько результатов. Если бы я искал страны с foaf:name "Romania"
, он вернул бы "Communist Romania"
, "Wallachian Romania"
, "Romania"
и т. Д. Из этих результатов только у одной были бы geo:lat
и geo:long
.
Как правило, если требуемое свойство не удовлетворено всеми результатами, результаты не возвращаются.
Неправильная онтология используется для geo
; должно быть <http://www.w3.org/2003/01/geo/wgs84_pos#>
.
Остальные нечетные результаты необходимо отфильтровать, чтобы сохранить только желаемые уникальные результаты. В этом случае фильтрация после несуществования из dbpedia-owl:dissolutionDate
работает.
Точные совпадения foaf: имя с использованием FILTER (?name="someCountryName"^^xsd:string)
не работает.
Вот код, который успешно извлекает значения широты и долготы для данной страны (будьте осторожны, при поиске нужной страны могут потребоваться некоторые другие фильтры):
//setup prefixes
$prefixes = 'PREFIX dbo:<http://dbpedia.org/ontology/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <http://dbpedia.org/resource/>
PREFIX dbpedia2: <http://dbpedia.org/property/>
PREFIX dbpedia: <http://dbpedia.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
';
//query no. 1 - find out "right" country - hoping for a unique result
$q1 = $prefixes.'SELECT ?c WHERE {
?c rdf:type dbo:Country;
foaf:name "'.$userPreferences->country.'"@en.
OPTIONAL {?c dbo:dissolutionDate ?x}
FILTER(!bound(?x))}';
//note: $userPreferences->country represents a country entered by the user in an input
//query no. 2 - find out long & lat
$q2 = $prefixes.'SELECT * WHERE {
<'.$countryReturned.'> geo:lat ?lat;
geo:long ?long.
}';
//note: $countryReturned represents the URI of the "unique" country my 1st query
//retrieved, we use it directly.
Для тех, кто увлечен PHP-библиотекой ARC2, вот как сделать запросы (примечание: не забудьте включить файл ARC2.php ):
$dbpediaEndpoint = array('remote_store_endpoint' =>'http://dbpedia.org/sparql');
$dbpediaStore = ARC2::getRemoteStore($dbpediaEndpoint);
$rows1 = $dbpediaStore->query($q1,'rows');
var_dump($rows1); //to see quick results