2013-05-29 35 views
2

我在DBpedia上使用SPARQL查詢到Prolog項目中,我有疑問。我會知道,如果一個詞最有可能是人名(類似於:約翰,馬里奧)或地方(如城市:羅馬,倫敦,紐約)。如何知道一個字符串是使用DBpedia的個人或地名的專有名稱?

我已經實現了以下兩個查詢,第一個給了我具有特定姓名的人數,第二個給了我具有特定姓名的地方數量。

1)查詢一個人姓名:

select COUNT(?person) where { 
    ?person a dbpedia-owl:Person . 
    { ?person foaf:givenName "John"@en } 
    UNION 
    { ?person foaf:surname "John"@en } 
} 

對於名稱約翰,我得到了以下的輸出:callret-0:7313,所以我認爲它已經找到7313實例名稱爲John。這樣對嗎?

2)查詢一個地名:

select COUNT(?place) where { 
    ?place a dbpedia-owl:Place . 
    { ?x rdfs:label "John"@en } 
} 

的問題是,你可以在以前的「地方」查詢看到,我已插入約翰作爲參數,這是不但我得到以下奇怪的結果:callret-0:81900104

問題是,這樣,如果我比較前兩個查詢的輸出,看來約翰我這是一個地方,而不是一個人的名字!這對我的範圍並不好;我嘗試過使用其他人名,並且總是發生這樣的情況:地點查詢給我的輸出比名稱查詢更大。

爲什麼?我錯過了什麼?我的查詢中是否有一些錯誤?我怎樣才能解決它有一個正確的結果?

回答

4

其實,當我運行查詢您提供:

select COUNT(?place) where { 
    ?place a dbpedia-owl:Place . 
    { ?x rdfs:label "John"@en } 
} 

我得到的結果是93027312,而不是81900104,但其實並不重要了。奇怪的結果是因爲?x?place不必被綁定到同一個東西,所以你得到了所有的dbpedia-owl:Places並對它們進行計數,但是結果行數是dbpedia-owl:Place乘以乘以的東西數與rdfs:label "[email protected]"

select COUNT(?place) where { ?place a dbpedia-owl:Place } 
=> 646023 

select COUNT(?x) where { ?x rdfs:label "John"@en } 
=> 144 

646023 × 144 = 93027312 

如果你真的問dbpedia-owl:Place S作的rdfs:label "[email protected]",你會得到任何結果:

select COUNT(?place) as ?numPlaces where { 
    ?place a dbpedia-owl:Place ; 
      rdfs:label "John"@en . 
} 

SPARQL results

此外,您可能會考慮使用dbpprop:name而不是rdfs:label。有些結果似乎是這樣更有用。例如,讓我們找到名爲"Springfield"的地方。如果我們問這個名字的地方,我們沒有得到結果:

select * where { 
    ?place a dbpedia-owl:Place ; 
      rdfs:label "Springfield"@en . 
} 

SPARQL results

但是,如果我們修改查詢並使用dbpprop:name,我們得到17.有些是重複的,所以你可能必須做其他事情來刪除重複。但是,關鍵是dbpprop:name得到了一些結果,而rdfs:label沒有。

select * where { 
    ?place a dbpedia-owl:Place ; 
      dbpprop:name "Springfield"@en . 
} 

SPARQL results

你甚至可以使用dbpprop:name與人的名字的時候,雖然它不是有用,因爲對於大多數人的dbpprop:name值是他們的整個的名字。要查找與約翰使用dbpprop:name給定的名稱的人需要像查詢:

select * where { 
    ?place a dbpedia-owl:Person ; 
      dbpprop:name ?name . 
    FILTER(STRSTARTS(str(?name), "John")) 
} 

(或者你可以使用包含代替STRSTARTS),但是這成爲更加昂貴,因爲它有選擇的所有人和他們的名字,然後過濾該集合。能夠根據特定名稱選擇人員(例如,使用foaf:givenName)效率更高。

+0

Tnx爲您的清晰解釋,現在我將更好地記錄SPARQL。我已經理解了我的錯誤,但是我在查詢中遇到了一些問題,這些查詢計算了一個地點的實例數量,這一個: 選擇COUNT(?地點)作爲?numPlaces其中{dbmore-owl:地點; rdfs:標籤「Roma」。 } 正如你可以看到,如果我把「羅姆」作爲參數輸出是:numPlaces = 0 如果我改變它,我使用「羅馬」輸出是numPlaces = 1 爲什麼這種行爲? – AndreaNobili

+1

@AndreaNobili'@ en'是文字的語言標記。英文名字是「羅馬」,而不是「羅馬」。如果您使用查詢'SELECT * WHERE {?放置一個dbpedia-owl:Place; rdfs:label「Roma」@it}',你會在結果中看到一行(http://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=SELECT+ * + WHERE +%7B +%3Fplace + A + DBpedia中-貓頭鷹%3APlace +%3B + RDFS%3Alabel +%22Roma%22%40it +%7D&格式=文本%2Fhtml&超時= 0&調試= ON)。 –

+2

@AndreaNobili正如[本答案](http://stackoverflow.com/a/2015371/1281433)中所述,您可以在忽略語言標記的同時搜索字符串,但這需要FILTER和字符串比較,而且很多比較慢。如果您使用意大利語(英語)搜索字符串,最好使用'@ it'('@ en')。 –

相關問題