SPARQL按类别获取dbpedia资源

时间:2017-04-26 22:13:50

标签: sparql geosparql

我是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,但它不适用于其他国家/地区。

1 个答案:

答案 0 :(得分:1)

  1. 如果您在呈现的DBpedia页面上读取“is SOME_PROPERTY of”,则表示反方向,即它以倒置形式显示三元组。因此,您必须在SPARQL查询中反转三重模式。就你的例子而言,这意味着大学是主题而巴黎是对象:

    ?u dbo:campus ?p

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

    FILTER(?name = "Paris"@en)

  3. 工作查询将是

    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语法。
    • 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")
      }