我正在尝试对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,你会看到从'妈妈咪呀开始!'列表中有很多重复项。
知道我缺少什么来获得没有重复的独特结果?谢谢!
[由格伦麦克唐纳编辑,澄清它的音乐剧在这里“重复”,而不是三重奏。]
答案 0 :(得分:5)
SPARQL返回变量绑定。您的“重复”是投影属性中倍数的笛卡尔积。 Mamma Mia有多位音乐作家和多位词作者,因此您可以获得可能在您的桌子中产生一排的各种组合。
多么痛苦啊? “解决方案”是使用CONSTRUCT而不是SELECT,并处理返回图形而不是表格。也许是这样的:
答案 1 :(得分:3)
重复项是否完全重复?即每个重复结果的每个变量的每个值都是相同的
如果是,请在DISTINCT
之后添加SELECT
关键字,以强制SPARQL引擎放弃重复解决方案。
如果没有,则Glenn完全正确,因为为各种属性提供了多个值,因此您将获得多个结果。您可以使用子查询GROUP BY
等进行复杂的解决方法,但它们往往会导致查询效率降低。有时您只需处理客户端的重复项。