首页 > 解决方案 > 如何在 SPARQL 中执行“过滤器(x IN(...))”?

问题描述

我正在尝试在 Wikidata 中加载 Biota/Q2382433 的所有子分类单元(即 P271“父分类单元”指向 Q2382433 的实体)。

以下查询工作正常

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,它产生零结果

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

标签: sparqlwikidata

解决方案


由于 Wikidata 上的某些原因,当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

结果

编辑: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

结果


推荐阅读