0

我是 SPARQL 的初学者。而且我无法在 DBpedia 上按城市获取所有大学的纬度和经度。

我尝试了很多事情都没有成功。 页面显示该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帖子,但它不适用于其他国家/地区。

4

1 回答 1

1
  1. 如果您SOME_PROPERTY在呈现的 DBpedia 页面上阅读“is of”,这意味着相反的方向,即它以倒置的形式显示三元组。因此,您必须反转 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不需要 a .
  • 尝试LANGMATCHES用于匹配文字中的语言。

“更好”的查询可能是:

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")
  }
于 2017-04-27T02:20:39.337 回答