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不产生第二个查询的结果。的主要内容,如果未能解决你的问题,请参考以下文章

仅当执行第一个查询的记录集中没有记录时,SPARQL 从第二个查询返回记录

SQL 占位符 和 union all

SQL 占位符 和 union all

SQL中MINUS的用法与UNION的用法

mysql explain结果含义

mysql 优化 explain