我在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
問題是,這樣,如果我比較前兩個查詢的輸出,看來約翰我這是一個地方,而不是一個人的名字!這對我的範圍並不好;我嘗試過使用其他人名,並且總是發生這樣的情況:地點查詢給我的輸出比名稱查詢更大。
爲什麼?我錯過了什麼?我的查詢中是否有一些錯誤?我怎樣才能解決它有一個正確的結果?
Tnx爲您的清晰解釋,現在我將更好地記錄SPARQL。我已經理解了我的錯誤,但是我在查詢中遇到了一些問題,這些查詢計算了一個地點的實例數量,這一個: 選擇COUNT(?地點)作爲?numPlaces其中{dbmore-owl:地點; rdfs:標籤「Roma」。 } 正如你可以看到,如果我把「羅姆」作爲參數輸出是:numPlaces = 0 如果我改變它,我使用「羅馬」輸出是numPlaces = 1 爲什麼這種行爲? – AndreaNobili
@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)。 –
@AndreaNobili正如[本答案](http://stackoverflow.com/a/2015371/1281433)中所述,您可以在忽略語言標記的同時搜索字符串,但這需要FILTER和字符串比較,而且很多比較慢。如果您使用意大利語(英語)搜索字符串,最好使用'@ it'('@ en')。 –