2017-04-26 71 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") 
    }