Запрос DBpedia возвращает несколько мюзиклов, несмотря на фильтры - PullRequest
3 голосов
/ 27 февраля 2011

Я пытаюсь использовать запрос 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!' в списке много дубликатов.

Есть идеи, что мне не хватает, чтобы получить уникальные результаты без дубликатов? Спасибо!

[Отредактировано Гленном Макдональдом, чтобы пояснить, что здесь «дублируются» мюзиклы, а не тройки.]

Ответы [ 2 ]

5 голосов
/ 28 февраля 2011

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

3 голосов
/ 28 февраля 2011

Являются ли дубликаты точными дубликатами?т.е. каждое значение для каждой переменной каждого дублированного результата идентично

Если это так, то добавьте ключевое слово DISTINCT после SELECT, чтобы заставить механизм SPARQL отбрасывать дублирующиеся решения.Гленн совершенно прав, потому что для различных свойств дано несколько значений, поэтому вы получите несколько результатов.Есть сложные обходные пути, которые вы можете сделать с подзапросами, GROUP BY и т. Д., Но они могут привести к менее эффективным запросам.Иногда вам просто приходится иметь дело с дубликатами на стороне клиента.

...