使用WikidataQueryServiceR向Wikidata查询字符串向量

时间:2018-03-09 12:19:03

标签: r sparql wikidata

提供电影的载体'名字,我想知道他们的类型查询维基数据。

由于我是R用户,我最近发现WikidataQueryServiceR与我正在寻找的示例完全相同:

library(WikidataQueryServiceR)
query_wikidata('SELECT DISTINCT
  ?genre ?genreLabel
WHERE {
  ?film wdt:P31 wd:Q11424.
  ?film rdfs:label "The Cabin in the Woods"@en.
  ?film wdt:P136 ?genre.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}')

## 5 rows were returned by WDQS

不幸的是,此查询使用静态文本,因此我想用向量替换The Cabin in the Woods。为了做到这一点,我尝试使用以下代码:

library(WikidataQueryServiceR)

example <- "The Cabin in the Woods" # Single string for testing purposes.

query_wikidata(paste('SELECT DISTINCT ?human ?humanLabel ?sex_or_gender ?sex_or_genderLabel WHERE {
  ?human wdt:P31 wd:Q5.
  ?human rdfs:label', example, '@en.
  ?human wdt:P21 ?sex_or_gender.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  OPTIONAL { ?human wdt:P2561 ?name. }
}', sep = ""))

但是这不能按预期工作,因为我得到以下结果:

Error in FUN(X[[i]], ...) : Bad Request (HTTP 400).

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您是否尝试输出SPARQL查询? -

  • rdfs:label
  • 之后没有空格
  • The Cabin in the Woods
  • 附近没有引号

在您的R代码中,而不是

  ?human rdfs:label', example, '@en.

第7行应该是:

  ?human rdfs:label "', example, '"@en.

虽然query_wikidata()可以接受字符串向量,但我建议使用SPARQL 1.1 VALUES,以避免过多的请求。

library(WikidataQueryServiceR)

example <- c("John Lennon", "Paul McCartney")

values <- paste(sprintf("('%s'@en)", example), collapse=" ")

query <- paste(
  'SELECT DISTINCT ?label ?human ?humanLabel ?sexLabel {
       VALUES(?label) {', values,
      '} 
       ?human wdt:P31 wd:Q5.
       ?human rdfs:label ?label.
       ?human wdt:P21 ?sex.
       SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
   }'
)  

query_wikidata(query)

对于大量VALUES,您可能需要使用WikidataQueryServiceR的开发版本:似乎只有开发版本支持POST请求。