2017-04-26 59 views
0

我是SPARQL的初学者。而且我在DBpedia上遇到了各城市所有大学的纬度和经度问题。SPARQL按类别获取dbpedia资源

我尝试了多件事,但没有成功。 This页面显示巴黎大学的dbo:campus属性,所以我喜欢获得具有此属性的大学列表,然后获取地理坐标。

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX dbo: <http://dbpedia.org/ontology/> 
SELECT ?name, ?univ, ?lat, ?long WHERE { 
    ?p rdf:type dbo:Place. 
    ?p rdfs:label ?name. 
    ?p dbo:campus ?u. 
    ?u geo:lat ?lat. 
    ?u geo:long ?long. 
    ?u rdfs:label ?univ 
    FILTER(LANG(?name) = "en"). 
    FILTER(?name = "Paris") 
} 

我查看该帖子DBpedia SPARQL Query US Universities但它不适用于其他国家。

+0

我们不是在这里做你的功课! – TallTed

+0

非常感谢@TallTed的评论,这真的有帮助! – winter

回答

1
  1. 如果读“是SOME_PROPERTY”呈现的DBpedia的页上时,这意味着相反的方向,即,它示出了在其反相形式的三倍。因此,您必须反转SPARQL查询中的三重模式。对于你的榜样,这意味着高校是主体和巴黎对象:

    ?u dbo:campus ?p

  2. 的标签语言标记在DBpedia中;因此,FILTER(?name = "Paris")是不够的。添加英文标签帮助:

    FILTER(?name = "Paris"@en)

一个工作的查询是

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX dbo: <http://dbpedia.org/ontology/> 
SELECT ?name, ?univ WHERE { 
    ?p rdf:type dbo:Place. 
    ?p rdfs:label ?name. 
    ?u dbo:campus ?p. 
    ?u geo:lat ?lat. 
    ?u geo:long ?long. 
    ?u rdfs:label ?univ 
    FILTER(LANG(?name) = "en"). 
    FILTER(?name = "Paris"@en) 
} 

一些评论:

  • 使用标签来匹配能资源导致不希望的结果。资源由URI标识;因此,如果可能的话使用URI。 VALUES子句是支持内联数据的SPARQL 1.1的一个很酷的功能。
  • 如果您使用URI,则可以省略rdf:type三重模式,因为您不必过滤给定标签的特定类型资源。
  • 官方SPARQL标准不允许在投影变量之间使用逗号;这是特定于Virtuoso的语法。
  • SPARQL支持更紧凑的Turtle语法。
  • A FILTER最后不需要.
  • 尝试使用LANGMATCHES来匹配文字中的语言。

A “更好” 的查询可以是:

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

SELECT ?name ?univ ?lat ?long 
WHERE 
    { VALUES ?p { dbo:Paris } 
    ?p rdfs:label ?name . 
    ?u dbo:campus ?p ; 
     geo:lat  ?lat ; 
     geo:long ?long ; 
     rdfs:label ?univ 
    FILTER langMatches(lang(?name), "en") 
    }