Определение того, являются ли ресурсы DBpedia городами или странами

Я использую DBpedia для извлечения информации об аэропортах с заданным кодом IATA. Запрос, который я использую, выглядит следующим образом. Результаты, которые я получаю, включают две строки для одного аэропорта; в одном город — это местоположение, а в другом — страна. Как я могу получить тип местоположения (будь то город или страна)? Это запрос, который я использую:

PREFIX dbpprop: <http://dbpedia.org/property/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT * WHERE { 
  ?subject rdf:type dbpedia-owl:Airport;
           rdfs:label ?label;
           dbpedia-owl:location ?location;
           dbpedia-owl:iataLocationIdentifier ?iata;
           geo:lat ?latitude;
           geo:long ?longitude.
  FILTER (lang(?label) = 'en' and regex(?iata, "MGQ"))
}

результаты SPARQL


person Vasya Rogov    schedule 06.06.2014    source источник


Ответы (1)


Как правило, у ресурсов может быть множество типов, потому что вещи имеют множество значений для предиката rdf:type. В этом случае похоже, что вы хотите получить связанный тип города или страны, если он присутствует. Если вы посмотрите на ресурс http://dbpedia.org/resource/Somalia, вы увидите, что он имеет тип dbpedia-owl:Country. Для http://dbpedia.org/resource/Mogadishu нет типа города, но есть поселение, и это может быть наиболее подходящим для определения городов.

Вы можете использовать values, чтобы указать набор допустимых значений для переменной, и использовать optional, чтобы получить некоторые совпадения, если они присутствуют. Например.,

select * where {
  ?subject rdf:type dbpedia-owl:Airport;
           rdfs:label ?label;
           dbpedia-owl:location ?location;
           dbpedia-owl:iataLocationIdentifier ?iata;
           geo:lat ?latitude;
           geo:long ?longitude.
  FILTER (langMatches(lang(?label),'en') && contains(?iata, "MGQ"))

  optional {
    values ?locationType { dbpedia-owl:Settlement dbpedia-owl:Country } 
    ?location a ?locationType
  }
}

результаты SPARQL

Также обратите внимание, что я использовал langMatches для проверки языковых тегов; это правильный способ сделать это. Поскольку регулярное выражение не делало ничего, кроме проверки наличия подстроки в строке, я изменил его на contains.

Для чего это стоит, я не знаю, использовал ли я этот шаблон values внутри optional раньше, но он мне скорее нравится, и я ожидаю, что он может быть полезен в будущем. Помещение values снаружи optional не дает такого же эффекта, потому что если вы сделаете это, то ?locationType всегда получит значение, просто часть optional может не совпадать. То есть, если вы возьмете values за пределы optional, вы получите четыре строки результатов: 2 местоположения 2 типа местоположения = 4 комбинации.

person Joshua Taylor    schedule 06.06.2014