2011-02-27 22 views
3

我試圖對DBpedia使用SPARQL查詢來檢索音樂劇列表和一些相關的屬性。然而,儘管使用了適當的過濾器(據我所知),但結果還是不止一次地包含了許多音樂劇。這裏是我的查詢:儘管過濾器DBpedia查詢返回一些音樂劇不止一次

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
    PREFIX dbo: <http://dbpedia.org/ontology/> 
    PREFIX dbpprop: <http://dbpedia.org/property/> 
    SELECT ?label ?abstract ?book ?music ?lyrics 
    WHERE { 
     ?play <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Broadway_musicals> ; 
      rdfs:label ?label ; 
      dbo:abstract ?abstract ; 
      dbpprop:book ?book ; 
      dbpprop:lyrics ?lyrics ; 
      dbpprop:music ?music . 
     FILTER (LANG(?label) = 'en')  
     FILTER (LANG(?abstract) = 'en') 
     FILTER (LANG(?book) = 'en') 
     FILTER (LANG(?lyrics) = 'en') 
     FILTER (LANG(?music) = 'en') 
    } 

結果列表有許多重複的條目。在此處粘貼查詢: DBpedia SPARQL Explorer,您會看到以「Mama Mia!」開頭。列表中有很多重複項。

任何想法我錯過了沒有重複的獨特結果?謝謝!

[由格倫·麥克唐納編輯澄清,這是被「複製」這裏的音樂劇,而不是三倍。]

回答

5

SPARQL返回變量綁定。您的「重複」是您預計屬性中的倍數的笛卡爾積。媽媽咪呀有多個音樂作家和多名作詞家,所以你可以得到他們的每種可能的組合,這可能會在你的桌子上產生一排。

真是痛苦,呵呵? 「解決方案」是使用CONSTRUCT而不是SELECT,並處理獲取圖表而不是表格。也許是這樣的:

http://dbpedia.org/snorql/?query=PREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0D%0A++++PREFIX+dbo%3A+%3Chttp%3A%2F%2Fdbpedia.org%2Fontology%2F%3E%0D%0A++++PREFIX+dbpprop%3A+%3Chttp%3A%2F%2Fdbpedia.org%2Fproperty%2F%3E%0D%0A++++CONSTRUCT+%7B%0D%0A++++++++%3Fplay+rdfs%3Alabel+%3Flabel+%3B%0D%0A++++++++++++dbo%3Aabstract+%3Fabstract+%3B%0D%0A++++++++++++dbpprop%3Abook+%3Fbook+%3B%0D%0A++++++++++++dbpprop%3Alyrics+%3Flyrics+%3B%0D%0A++++++++++++dbpprop%3Amusic+%3Fmusic+.%0D%0A++++%7D%0D%0A++++WHERE+%7B+%0D%0A++++++++%3Fplay+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Fterms%2Fsubject%3E+%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FCategory%3ABroadway_musicals%3E+%3B%0D%0A++++++++++++rdfs%3Alabel+%3Flabel+%3B%0D%0A++++++++++++dbo%3Aabstract+%3Fabstract+%3B%0D%0A++++++++++++dbpprop%3Abook+%3Fbook+%3B%0D%0A++++++++++++dbpprop%3Alyrics+%3Flyrics+%3B%0D%0A++++++++++++dbpprop%3Amusic+%3Fmusic+.%0D%0A++++++++FILTER+%28LANG%28%3Flabel%29+%3D+%27en%27%29++++%0D%0A++++++++FILTER+%28LANG%28%3Fabstract%29+%3D+%27en%27%29%0D%0A++++++++FILTER+%28LANG%28%3Fbook%29+%3D+%27en%27%29%0D%0A++++++++FILTER+%28LANG%28%3Flyrics%29+%3D+%27en%27%29%0D%0A++++++++FILTER+%28LANG%28%3Fmusic%29+%3D+%27en%27%29%0D%0A++++%7D

+1

這真的只適用,因爲圖表沒有重複的三元組,並且它留下了一個問題來處理解析RDF語法,所以我認爲Rob的答案更有用。 – 2011-02-28 16:06:38

+0

RobV沒有看數據,但寫了一個關於什麼可能工作的快速推測性答案,以防應用。這是一件好事,但在這種情況下,我實際上查看了數據並知道這不是重複問題。所以Rob的回答不可能比我的「更有用」,因爲它在這種情況下根本沒有用。 – 2011-02-28 16:23:35

+0

非常有意義,謝謝!我是SPARQL的新手,但我明白爲什麼我會得到多個結果。我將研究CONSTRUCT語句以及如何正確處理圖結果。 – 2011-02-28 16:26:53

3

是重複的號碼完全相同?即,對於每個重複的結果的每一變量的每一個值是相同

如果是的話SELECT後添加DISTINCT關鍵字迫使SPARQL發動機丟棄重複的解決方案。

如果沒有,那麼格倫是完全正確的,因爲有不同的屬性給出了多個值,所以你會得到多個結果。你可以用子查詢GROUP BY等做些複雜的變通辦法,但它們往往會導致效率較低的查詢。有時你只需要處理客戶端的重複。