我正在尝试对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,您将看到以“妈妈咪呀!”开头的查询。列表中有很多重复项。
你知道我在没有重复的情况下得到独特的结果会遗漏什么吗?谢谢!
格伦·麦克唐纳编辑,澄清这里是“复制”的音乐剧,而不是三重。
发布于 2011-02-28 12:43:15
SPARQL返回变量绑定。你的“副本”是你的投影属性中倍数的笛卡尔乘积。Mamma Mia有多个音乐作者和多个词作者,所以你可以得到他们的每一个可能的组合,这可能会在你的表中产生一行。
太痛苦了,是吧?“解决方案”是使用CONSTRUCT而不是SELECT,并处理返回图形而不是表。可能是这样的:
发布于 2011-02-28 17:58:31
复制品是完全相同的复制品吗?即每个重复结果的每个变量的每个值都是相同的
如果是,则在SELECT之后添加DISTINCT关键字,以强制SPARQL引擎丢弃重复的解决方案。
如果不是,那么Glenn是完全正确的,因为为各种属性提供了多个值,因此您将获得多个结果。您可以对子查询、GROUP BY等执行复杂的变通方法,但它们往往会导致查询效率较低。有时,您只需在客户端处理重复的内容。
https://stackoverflow.com/questions/5135577
复制相似问题