尽管过滤器,DBpedia查询不止一次返回一些音乐剧

时间:2011-02-27 20:07:28

标签: sparql dbpedia

我正在尝试对DBpedia使用SPARQL查询来检索音乐剧列表和一些相关属性。然而,尽管使用了适当的滤镜(据我所知),结果包括许多音乐剧不止一次。这是我的疑问:

    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,你会看到从'妈妈咪呀开始!'列表中有很多重复项。

知道我缺少什么来获得没有重复的独特结果?谢谢!

[由格伦麦克唐纳编辑,澄清它的音乐剧在这里“重复”,而不是三重奏。]

2 个答案:

答案 0 :(得分:5)

SPARQL返回变量绑定。您的“重复”是投影属性中倍数的笛卡尔积。 Mamma Mia有多位音乐作家和多位词作者,因此您可以获得可能在您的桌子中产生一排的各种组合。

多么痛苦啊? “解决方案”是使用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 :(得分:3)

重复项是否完全重复?即每个重复结果的每个变量的每个值都是相同的

如果是,请在DISTINCT之后添加SELECT关键字,以强制SPARQL引擎放弃重复解决方案。

如果没有,则Glenn完全正确,因为为各种属性提供了多个值,因此您将获得多个结果。您可以使用子查询GROUP BY等进行复杂的解决方法,但它们往往会导致查询效率降低。有时您只需处理客户端的重复项。