过滤器不存在会产生令人困惑的结果

时间:2016-01-17 19:47:45

标签: sparql

我在sparql中尝试了以下查询:

Select distinct (count(?jel) AS ?jelCount )

Where {

  ?jel a skos:Concept .
  ?jel skos:prefLabel ?label .


  Filter not Exists {
    ?jel skos:narrower ?narrower .
    ?jel skos:notation ?notation .
  }             
}

然而它并没有给我我想要的答案,它实际上没有过滤任何东西。

但是,如果我写:

Select distinct (count(?jel) AS ?jelCount )

Where {

  ?jel a skos:Concept .
  ?jel skos:prefLabel ?label .


Filter not Exists {
    ?jel skos:narrower ?narrower .
  }

  Filter not Exists {
    ?jel skos:notation ?notation .
  }

}

然后我得到了我想要的答案。

我无法解释原因?有人可以赐教我吗?

1 个答案:

答案 0 :(得分:1)

在SPARQL中,每个模式的整体(由{ }表示)必须匹配才能生效。

因此,您的第一个查询会询问项目不存在{{1>}和skos:narrower三元组 的项目,因为它们位于同一个skos:notation图案。据推测,没有任何项目存在数据中的项目的三个三元组,因此没有任何过滤掉。

但是,在您的第二个查询中,您要求FILTER NOT EXISTSskos:narrower 不存在的项目(因为每个项目都是单独的skos:notation模式)。由于数据中的某些项目存在一些三元组,因此有些内容会被过滤掉。