SPARQL 按类别获取 dbpedia 资源

SPARQL get dbpedia ressources by category

我是 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")
}

我检查了这个 post DBpedia SPARQL Query US Universities 但它不适用于其他国家/地区。

  1. 如果您在渲染的 DBpedia 页面上读到“is SOME_PROPERTY 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 不需要最后的 .
  • 尝试使用 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")
  }