SPARQL UNION不产生第二个查询的结果。

问题描述 投票:0回答:1

我试图在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.

我做错了什么?

sparql wikidata
1个回答
0
投票

根据用户 @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. }
}
© www.soinside.com 2019 - 2024. All rights reserved.