Неправильный запрос Sparql из-за неправильной геопозиции + отсутствие в результатах требуемого свойства

Я использую библиотеку ARC2 для php для выполнения запросов sparql, и я застрял в этой проблеме (я не думаю, что это как-то связано с библиотекой).

Этот запрос отлично работает - в моем приложении и в snorql dbpedia:

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.geonames.org/ontology#>

SELECT * WHERE {
?c rdf:type dbo:Country;
foaf:name "someCountryName"@en.
}

С другой стороны, этот запрос не работает:

SELECT * WHERE {
?c rdf:type dbo:Country;
foaf:name "someCountryName"@en;
geo:lat ?lat.
}

Примечание: запрос выполняется с использованием тех же префиксов, что и перечисленные выше. Мне просто нужно взять широту и долготу страны. Я также мог бы попробовать Freebase, но мне действительно нужно заставить его работать здесь. Второй запрос работает в snorql, не понимаю, почему он не работает и в моем приложении? Любая помощь высоко ценится!


person Irina M.    schedule 17.06.2011    source источник
comment
Теперь, когда 8 часов истекли, не могли бы вы разделить вопрос и ответ? И снова сделать вопрос в заголовке вопросом? (Стремимся к неотвеченным вопросам SPARQL)   -  person Ben Companjen    schedule 29.03.2013
comment
Трюк dissolutionDate для Румынии также появился в этом вопросе.   -  person Joshua Taylor    schedule 21.06.2013


Ответы (1)


Примечание. Этот текст был предоставлен @IrinaM, но помещен в вопрос как редакция из-за ограничения в восемь часов. Сейчас намного позже, и предложение @IrinaM опубликовать сообщение в качестве ответа не было принято. Вот слегка отредактированный ответ CW, содержащий этот текст.

В коде вопроса есть несколько ошибок.

  1. Второйй запрос (тот, который не "сработал") вернет несколько результатов. Если бы я искал страны с foaf:name "Romania", он вернул бы "Communist Romania", "Wallachian Romania", "Romania" и т. д. Из этих результатов только в одном были бы geo:lat и geo:long. По сути, когда требуемое свойство не удовлетворяет всем результатам, результаты не возвращаются.

  2. Для geo используется неправильная онтология; должно быть <http://www.w3.org/2003/01/geo/wgs84_pos#>.

  3. Другие странные результаты необходимо отфильтровать, чтобы сохранить только желаемые уникальные результаты. В этом случае работает фильтрация после отсутствия dbpedia-owl:dissolutionDate. Точные совпадения foaf:name с использованием 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.

Для тех, кто увлечен библиотекой ARC2 PHP, вот как делать запросы (примечание: не забудьте включить файл 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
person Community    schedule 07.08.2013