SPARQL UNION不产生第二个查询的结果。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPARQL UNION不产生第二个查询的结果。相关的知识,希望对你有一定的参考价值。
我试图在Wikidata的SPARQL端点query.wikidata.org中,将所有主权国家和部分被承认主权的国家(台湾、科索沃)一起载入。这是我的SPARQL。
SELECT ?item ?iso2
WHERE {
{
?item wdt:P31 wd:Q3624078.
?item p:P31 ?statement.
?statement ps:P31 wd:Q3624078.
FILTER NOT EXISTS { ?statement pq:P582 ?end. }
}
UNION {
FILTER(?item IN (wd:Q865, wd:Q1246))
}
OPTIONAL { ?item wdt:P297 ?iso2. }
}
如你所见,主权国家是用SPARQL语句加载的,但台湾和科索沃是显式添加的,使用的是 FILTER
子句。
过滤器子句本身工作正常。
SELECT ?item ?iso2
WHERE {
FILTER(?item IN (wd:Q865, wd:Q1246))
OPTIONAL { ?item wdt:P297 ?iso2. }
}
但是,组合语句并没有产生两个明确的结果: wd:865
, wd:1246
.
我做错了什么?
答案
根据用户 @UninformedUser 的评论,答案是:? FILTER
总是过滤掉项目。它不能用来向结果集添加项目(根据术语,这似乎是合乎逻辑的)。所以在我的 UNION
子句,第二个结果集总是空的。
正确的选择是得到一个结果集,其成员是显式定义的。VALUES
:
SELECT ?item ?iso2
WHERE {
{
?item wdt:P31 wd:Q3624078.
?item p:P31 ?statement.
?statement ps:P31 wd:Q3624078.
FILTER NOT EXISTS { ?statement pq:P582 ?end. }
}
UNION {
VALUES ?item { wd:Q865 wd:Q1246 }
}
OPTIONAL { ?item wdt:P297 ?iso2. }
}
以上是关于SPARQL UNION不产生第二个查询的结果。的主要内容,如果未能解决你的问题,请参考以下文章