[英]Determining whether DBpedia resources are Cities or Countries
我使用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"))
}
通常,資源可以具有許多類型,因為事物對於謂詞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
}
}
另外請注意,我已經使用langMatches
來檢查語言標簽; 這是正確的方法。 由於正則表達式除了檢查字符串中是否存在子字符串外沒有做其他事情,因此我將其更改為contains
。
對於它的價值,我不知道我以前是否在optional
模式中使用過此values
,但我更喜歡它,並且我希望它將來會有用。 將values
放在 optional
values
之外不會有相同的效果,因為如果這樣做,則?locationType
總是會得到一個值,只是optional
部分可能不匹配。 也就是說,如果您將values
取於optional
之外,則會得到四個結果行:2個位置×2個locationTypes = 4個組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.