【问题标题】:Wikidata query duplicates维基数据查询重复
【发布时间】:2016-12-29 10:03:59
【问题描述】:

对不起,如果我的英语不好,但我真的没有任何地方可以用我的母语提出这个问题。 我一直在尝试为 Wikidata 创建 SPARQL 查询,该查询应该创建一个列表,其中列出了 1925-1950 年间创作的所有恐怖小说、作者姓名以及(如果有的话)图片:

SELECT DISTINCT ?item ?itemLabel ?author ?name ?creation ?picture
WHERE
{
    ?item wdt:P136 wd:Q193606 . # book
    ?item wdt:P50 ?author .   # author
    ?item wdt:P577 ?creation .
    ?item wdt:P577 ?end .
  ?author rdfs:label ?name .    
  OPTIONAL{ ?item wdt:P18 ?picture }
  FILTER (?creation >= "1925-01-01T00:00:00Z"^^xsd:dateTime) .
  FILTER (?end <= "1950-12-31T23:59:59Z"^^xsd:dateTime) .

SERVICE wikibase:label
{ 
bd:serviceParam wikibase:language "en" .
} 
}

但是,由于某种原因,此查询将重复项放入列表中。 DISTINCT 没有多大作用。一段时间后,我发现原因是“?item rdfs:label ?name.”。如果删除此行,则不会列出任何重复项。但我需要这一行来在列表中显示作者姓名! 有关如何解决此问题的任何想法?

【问题讨论】:

    标签: sparql wikidata


    【解决方案1】:

    查询实际上是为您提供不同的项目。问题是某些项目有多个 rdfs:labels。您可以将项目视为示例:

    SELECT *
    WHERE
    {
       wd:Q2882840 rdfs:label ?label
    
    SERVICE wikibase:label
    { 
    bd:serviceParam wikibase:language "en" .
    } 
    }
    

    由于某些项目有多个 rdfs:label 谓词,因此它们显示在单独的行中。

    【讨论】:

    • 那么,我想,有没有办法让这个查询正常工作?
    • 如果有多个标签,您会返回多行 - 这就是定义 SPARQL 语义的方式。您可以 i) 限制标签的数量或 ii) 使用 GROUP_CONCAT 将所有标签组合成一个值。
    • 我尝试了{ select * where {?author rdfs:label ?name.} LIMIT 1} 而不是?author rdfs:label ?name 行,但它似乎不起作用(返回没有结果);不知道为什么。
    • 通过 google 找到了一些使用 GROUP_CONCAT 的示例,但它不适用于我的查询,说“聚合错误”。 LIMIT 的想法实际上听起来不错。如果它会起作用,叹息。
    • @Dusk 在下面查看我的答案
    【解决方案2】:

    您不需要使用?item rdfs:label ?name .,因为您已经获得了?itemLabel 的项目标签,感谢SERVICE wikibase:label

    然后,对于具有可能具有多个值的SELECTed 属性的每个项目,您将获得重复的结果:这里,您是SELECTing authors (P50),这将为具有多个作者的每个项目创建重复项。

    【讨论】:

    • 呃,我的错。这条线应该是?author rdfs:label ?name .没有它,我没有作者的名字,我只有一个链接。我应该怎么做才能让它正常工作?
    • 那你应该也只需要SELECT ?authorLabel,我猜
    • 成功了!如此简单,但我不认为我会自己解决这个问题。非常感谢!
    【解决方案3】:

    您可以使用

    根据书名(项目的标签)汇总结果

    分组

    关键字。 因此,每个结果都将是一个显示一次的组,并且具有不同值的其他字段将使用分隔符(在本例中为逗号)进行聚合。

    固定查询:

    SELECT DISTINCT ?item ?itemLabel 
    (group_concat(distinct ?author;separator=",") as ?author)
    (group_concat(distinct ?name;separator=",") as ?name)
     (group_concat(distinct ?creation;separator=",") as ?creation)
     (group_concat(distinct ?picture;separator=",") as ?picture)
    WHERE
    {
        ?item wdt:P136 wd:Q193606 . # book
        ?item wdt:P50 ?author .   # author
        ?item wdt:P577 ?creation .
        ?item wdt:P577 ?end .
      ?author rdfs:label ?name .    
      OPTIONAL{ ?item wdt:P18 ?picture }
      FILTER (?creation >= "1925-01-01T00:00:00Z"^^xsd:dateTime) .
      FILTER (?end <= "1950-12-31T23:59:59Z"^^xsd:dateTime) .
    
    SERVICE wikibase:label
    { 
    bd:serviceParam wikibase:language "en" .
    } 
    }
    group by ?item ?itemLabel
    

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 2017-02-22
      • 1970-01-01
      相关资源
      最近更新 更多