3

我正在尝试对 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,您会看到以“妈妈咪呀!”开头 列表中有很多重复项。

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

[由 glenn mcdonald 编辑,澄清这里“复制”的是音乐剧,而不是三重奏。]

4

2 回答 2

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++++构造+%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++++++++过滤器+%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++++++++过滤器+%28LANG%28%3F音乐%29+%3D+%27en%27%29%0D%0A++++%7D%0D%0A++++++++过滤器+%28LANG%28%3Flabel%29+%3D+%27en%27%29++++%0D%0A++++++++过滤器+%28LANG% 28%3Fabstract%29+%3D+%27en%27%29%0D%0A++++++++过滤器+%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%0D%0A++++++++过滤器+%28LANG%28%3Flabel%29+%3D+%27en%27%29++++%0D%0A++++++++过滤器+%28LANG% 28%3Fabstract%29+%3D+%27en%27%29%0D%0A++++++++过滤器+%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

于 2011-02-28T04:43:14.773 回答
3

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

如果是这样,则添加DISTINCT关键字 afterSELECT以强制 SPARQL 引擎丢弃重复的解决方案。

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

于 2011-02-28T09:58:31.023 回答