如何在 SPARQL 中执行 `FILTER (x IN ( ... ) )`?

How to do `FILTER (x IN ( ... ) )` in SPARQL?

我正在尝试加载维基数据中 Biota/Q2382433 的所有子分类单元(即 P271 "parent taxon" 指向 Q2382433 的实体)。

以下查询works fine

SELECT ?item ?itemLabel
(GROUP_CONCAT(DISTINCT ?class; SEPARATOR=", ") AS ?classes)
WHERE {
    ?class wdt:P171 ?item.
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    BIND(wd:Q2382443 AS ?item)
}
GROUP BY ?item ?itemLabel

使用 FILTER 而不是 BIND,它会产生 zero results:

SELECT ?item ?itemLabel
(GROUP_CONCAT(DISTINCT ?class; SEPARATOR=", ") AS ?classes)
WHERE {
    ?class wdt:P171 ?item.
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    FILTER(?item in (wd:Q2382443))
}
GROUP BY ?item ?itemLabel

如何使用 FILTER 使查询正常工作?

由于维基数据的某些原因,当 itemLabel 添加到 SELECT 子句时,过滤器将不起作用。但是,如果删除它,查询将正常工作。

您还可以使用新变量名重新声明三重模式并对其进行过滤:

SELECT ?item ?itemLabel
(GROUP_CONCAT(DISTINCT ?class; SEPARATOR=", ") AS ?classes)
WHERE {
    ?class wdt:P171 ?item .
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }

    ?class wdt:P171 ?parentTaxon .
    FILTER(?parentTaxon IN (wd:Q2382443))
}
GROUP BY ?item ?itemLabel

Results

编辑:VALUE 也有效:

SELECT ?item ?itemLabel
(GROUP_CONCAT(DISTINCT ?class; SEPARATOR=", ") AS ?classes)
WHERE {
    ?class wdt:P171 ?item .
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    VALUES ?item { wd:Q2382443 }
}
GROUP BY ?item ?itemLabel

Results