我使用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"))
}
答案 0 :(得分:4)
通常,资源可以包含 lot 类型,因为谓词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
。
对于它的价值,我不知道我之前是否使用过这种values
optional
模式,但我更喜欢它,我希望它在将来有用。将values
放在<{1}}之外的效果不一样,因为如果你这样做,那么optional
总会获得一个值,它就是只是?locationType
部分可能不匹配。也就是说,如果你取optional
之外的values
,你将得到四个结果行:2个位置×2个位置类型= 4个组合。