Wikidata:通过 SPARQL 查询获取所有非古典音乐家

Wikidata: Get all non-classical Musicians via SPARQL query

我希望这种问题在这里被允许,因为它更像是一个维基数据特定的问题。无论如何,我尝试通过 SPARQL 从 Wikidata 获取所有非古典音乐的音乐家。现在我有这个代码:

SELECT ?value ?valueLabel ?born WHERE {
  {
    SELECT DISTINCT ?value ?born WHERE {
      ?value wdt:P31 wd:Q5 . # all Humans
      ?value wdt:P106/wdt:P279* wd:Q639669 . # of occupation or subclass of occupation is  musician
      ?value wdt:P569 ?born . # Birthdate
      FILTER(?born >= "1981-01-01T00:00:00Z"^^xsd:dateTime) # filter by Birthyear
    }
    ORDER BY ASC(?born)
    #LIMIT 500
  }

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

这让我(理论上)所有职业是音乐家(https://www.wikidata.org/wiki/Q639669)并且出生在 1900 年之后的人。(理论上因为这个查询运行时间太长,我不得不把它分成更小的块)

然而,我所追求的是排除初级古典音乐家的人。有什么 属性 我不知道的吗?否则,我将如何更改我的查询以能够按特定属性(如 Q21680663,古典作曲家)进行过滤?

谢谢!

如果您查看查询界面中的 Examples 选项卡并在搜索字段中键入 music,您会发现一个示例几乎击中现场: Musicians or singers that have a genre containing 'rock'.

我主要用它来获取所有音乐家及其流派的列表。我最终确定了一个 MINUS 查询,减去任何接触西方古典音乐或巴洛克音乐的音乐家,后者专门用于获取巴赫这个老混蛋。

SELECT DISTINCT 
    ?human ?humanLabel 
    (GROUP_CONCAT(DISTINCT ?genreLabel; SEPARATOR = ", ") AS ?genres) 
WHERE {
    {
        ?human wdt:P31 wd:Q5;
               wdt:P106 wd:Q639669;
               wdt:P136 ?genre.
    } MINUS {
        VALUES ?classics {
            wd:Q9730
            wd:Q8361
        }
        ?human wdt:P136 ?classics.
     }
  
  
  # This is just boilerplate to get the labels.
  # it's slightly faster this way than the label
  # service, and the query is close to timing out already
  ?genre rdfs:label ?genreLabel.
  FILTER((LANG(?genreLabel)) = "en")
  ?human rdfs:label ?humanLabel.
  FILTER((LANG(?humanLabel)) = "en")
}
GROUP BY ?humanLabel ?human

In the Query Interface: 25,000 results in 20sec

下面是结果的样子(来自一些中间版本,因为我现在不重做 table)。

artist genres
Gigi D'Agostino Latin jazz, Italo dance
Erykah Badu neo soul, soul music
Yoko Kanno jazz, blues, pop music, J-pop, film score, New-age music, art rock, ambient music
Michael Franks pop music, rock music
Harry Nilsson rock music, pop music, soft rock, baroque pop, psychedelic rock, sunshine pop
Yulia Nachalova jazz, pop music, soul music, contemporary R&B, blue-eyed soul, estrada
Linda McCartney pop rock

从原来的例子来看,您可能想尝试也包括歌手。接下来,用“P106”替换现有行,结果大约是原来的两倍。但是经常超时。

  VALUES ?professions {
     wd:Q177220
     wd:Q639669
  }
  wdt:P106 ?professions;    

Query including singers, 53,000 results but may time out

该示例还使用以下内容来大幅减少结果,方法是仅包括具有一定数量陈述的项目,假设这些项目与...相关。您可能想尝试使用它来关注最重要的结果,或者给您空间以避免其他更改超时。不过,也许尝试低于 50 的限制来找到合适的平衡是个好主意。

?human wikibase:statements ?statementcount.        
FILTER(?statementcount > 50 )

A query with singers and the statement limit

这是较早的版本。它排除了所有列出的流派,但包括与任何其他流派相关的任何音乐家,其中有许多可能有资格被称为“经典”。过滤器使用“NOT IN”构造,这对我来说似乎比基于标签的过滤更干净。

SELECT DISTINCT 
    ?human ?humanLabel 
    (GROUP_CONCAT(DISTINCT ?genreLabel; SEPARATOR = ", ") AS ?genres) 
WHERE {
   ?human wdt:P31 wd:Q5;
          wdt:P106 wd:Q639669;
          wdt:P136 ?genre.
    
    # The "MAGIC": Q9730 is "Western Classical Music"
    # Q1344 is "opera"
    # Then I noticed Amadeus, Wagner, and Bach all slipped through and expanded the list, and it's a really
    # ugly way of doing this
    FILTER(?genre NOT IN(wd:Q9730, wd:Q1344, wd:Q9734, wd:Q9748, wd:Q189201, wd:Q8361, wd:Q2142754, wd:Q937364, wd:Q1546995, wd:Q1746028, wd:Q207338, wd:Q3328774, wd:Q1065742))

    ?genre rdfs:label ?genreLabel.
    FILTER((LANG(?genreLabel)) = "en")
    ?human rdfs:label ?humanLabel.
    FILTER((LANG(?humanLabel)) = "en")
}
GROUP BY ?humanLabel ?human

我得到了 26,000 个结果。 View in Query Interface

请注意,这仍然 return 流派中有“西方古典音乐”的艺术家,只要他们 与其他流派相关联。要排除任何涉足古典音乐的音乐家,您必须 启动白天排名前 30 的广播电台 使用 MINUS 构造,从本质上讲,减去所有这些。