2015-04-02 78 views
0

我上http://dbpedia.org/sparqlDBpedia的SPARQL可選

PREFIX p: <http://dbpedia.org/property/> 
SELECT * WHERE { 
    ?person dcterms:subject category:British_journalists . 
    OPTIONAL { ?person p:name ?name } . 
    OPTIONAL { ?person p:dateOfBirth ?dob } . 

} 
LIMIT 10 

運行這個簡單的查詢,我期望從http://dbpedia.org/resource/Category:British_journalists獲得第10人是否有namedateOfBirth與否。我得到了擁有兩種房產的前10名人士。對於例如Andrew Rothstein之後有2人失蹤。

我在做什麼錯?

+1

「我希望得到前10個人......」 - 爲什麼?什麼讓你認爲你可以依賴任何特定的訂單,當沒有指定時? – 2015-04-02 13:24:40

+0

由於@ O.R.Mapper建議你的問題含糊不清。你真的想做什麼? – Artemis 2015-04-02 13:58:59

+0

@ O.R.Mapper Point採取。刪除限制帶來了完整的結果集,顯示OPTIONAL實際上正在工作。 – Gemseeker 2015-04-02 14:49:29

回答

2

與您的查詢的問題是,a)LIMIT限制行的數量返回,而不是主題,和b)有些人有多個名稱。例如,記者丹尼爾·辛格(http://dbpedia.org/resource/Daniel_Singer_(journalist))至少有兩個名字:"Daniel Singer"@en"Singer, Daniel"@en。這使他成爲主題的行數增加了一倍。

如果你GROUP BY ?person你確保每行只有一個人。然後您需要SAMPLE名稱和dobs每人只選一個。

PREFIX p: <http://dbpedia.org/property/> 
SELECT ?person (SAMPLE(?name) as ?aname) (SAMPLE(?dob) as ?adob) WHERE { 
    ?person dcterms:subject category:British_journalists . 
    OPTIONAL { ?person p:name ?name } . 
    OPTIONAL { ?person p:dateOfBirth ?dob } . 
} 
GROUP BY ?person 
LIMIT 10 

(我不知道如何與SAMPLE結合的情況下,即扮演那裏是不是名字)

+0

謝謝!當每個人需要單個記錄並且任何樣本名稱都可接受時,這是一個很棒的技巧。最初的查詢給了我所有的名字變體。 – Gemseeker 2015-04-02 14:54:47

+0

如果你想要所有的變體,你可以使用不同的聚合器:'GROUP_CONCAT(?name; separator =「,」)'而不是'SAMPLE'。這對所有名稱都是唯一的價值。 – user205512 2015-04-02 15:22:35

+0

太棒了!謝謝。 – Gemseeker 2015-04-02 15:30:46

0

按OR映射的評論 - 去除限制帶來的整個結果集,這表明可選實際上是有效的。 謝謝。