我正在尝试了解如何使用SPARQL从Wikidata的发布位置列表中选择一个发布日期。我有一个查询,我认为它很接近,但是我正在寻找一些帮助来缩小它的范围。到目前为止,我的工作是:
SELECT ?item ?itemLabel ?publication_date WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
VALUES (?item) {(wd:Q18486021)}
{SELECT ?item ?publication_date WHERE {
?item p:P577 ?publication_date_entry.
?publication_date_entry pq:P291 wd:Q30.
?item wdt:P577 ?publication_date.
}}
}
我正试图从https://www.wikidata.org/wiki/Q18486021(《星球大战:最后的绝地武士》)中获取与美国相符的发行日期。如果向下滚动到发布日期部分,您会注意到有5个发行版本。我想选择美国发行日期(2017年12月15日)。碰巧是第一个,但我想对此进行概括,以便我可以得出任何电影在美国的发行日期。从这里开始,我想将其概括为与所有电影的美国发行日期相匹配。
我认为我在上面做的是一个子查询,它试图匹配美国的发行日期,但每次发行都会导致一行(共5个)。
答案 0 :(得分:0)
在@AKSW的帮助下,我得出了以下结论。我使用了OPTIONAL
,GROUP BY
和GROUP_CONCAT
,因为有些电影在美国发行的日期不止一次。
SELECT ?item ?itemLabel
(GROUP_CONCAT(DISTINCT ?publication_date;separator=',') as ?publication_date)
WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
VALUES (?item) {(wd:Q23780734) (wd:Q18486021) (wd:Q23780914) (wd:Q22000542)}
?item wdt:P31 wd:Q11424;
OPTIONAL {
?item p:P577 ?publication_date_entry.
?publication_date_entry ps:P577 ?publication_date. # publication date statement
?publication_date_entry pq:P291 wd:Q30. # qualifier on the release date
}
FILTER(xsd:date(?publication_date) > "2017-01-01"^^xsd:date)
}
GROUP BY ?item ?itemLabel
LIMIT 10