SPARQL DBPedia查询座位容量,优化并删除重复项

时间:2019-05-27 15:19:32

标签: query-optimization sparql geosparql

我想在DBPedia上获取所有具有容纳人数信息的对象。我可以选择获取他们的标签,地址,经纬度信息。

我的问题是,即使按语言过滤,我也会得到很多重复。如何获得基于“地址”或任何其他属性的不同条目?

还可以告诉您该查询的哪些部分可以改进,以便在使用公共DBpedia endpoint时查询不会超时?谢谢!

PREFIX dbpediaO: <http://dbpedia.org/ontology/>

SELECT ?place ?label ?capacity ?address ?lat ?lon WHERE {

?place dbpedia2:seatingCapacity ?capacity .


OPTIONAL{

?place dbpediaO:address ?address . 
?place rdfs:label ?label .
?plage geo:lat ?lat .
?place geo:long ?lon .
    }

filter (lang(?label) = "en" || lang(?label) = "eng")
filter (lang(?address) = "en" || lang(?address) = "eng")

}

1 个答案:

答案 0 :(得分:0)

您的位置具有多个值,例如address。唯一的是URI本身。此外,您应该将每个属性放在单独的OPTIONAL中,或者至少对lat / long使用单独的OPTIONAL子句。对于标签,DBpedia中根本不需要OPTIONAL子句。获得唯一位置的唯一方法是按位置分组并对所有其他属性进行采样或group_concat。像这样:

PREFIX dbo: <http://dbpedia.org/ontology/> 
SELECT ?place (sample(?_label) as ?label) 
(group_concat(?capacity; separator=";") as ?capacities) 
(group_concat(?address; separator=";") as ?adresses) ?lat ?lon 
WHERE { 
  ?place dbo:seatingCapacity ?capacity ; 
         rdfs:label ?_label . 
  filter (langmatches(lang(?_label),"en")) 
  OPTIONAL { 
       ?place dbo:address ?address . 
       filter (langmatches(lang(?address), "en"))
  } OPTIONAL { 
       ?place geo:lat ?lat ; geo:long ?lon . 
  } 
} 
group by ?place ?lat ?lon 
order by desc(?place) 
limit 100

如您所见,场所还有多个容量值。