确定DBpedia资源是城市还是国家

Vas*_*gov 5 rdf semantic-web sparql 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"))
}
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

Jos*_*lor 5

一般来说,资源可以有很多类型,因为事物有很多谓词值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
  }
}
Run Code Online (Sandbox Code Playgroud)

SPARQL 结果

另请注意,我曾经langMatches检查过语言标签;这是正确的做法。由于正则表达式除了检查字符串中是否出现子字符串之外没有做任何事情,因此我将其更改为contains.

对于它的价值,我不知道我以前是否使用过这个values内部optional模式,但我相当喜欢它,并且我希望它将来可能有用。values 将 放在外面没有相同的效果,因为如果这样optional做,那么?locationType总是会得到一个值,只是该optional部分可能不匹配。也就是说,如果您采用values的外部optional,您将获得四个结果行:2 个位置 × 2 个位置类型 = 4 个组合。