SPARQL过滤器正则表达式和联合

时间:2016-05-14 13:08:15

标签: sparql ontology

我的本​​体有两个课程:food foodSource。 我想使用SPARQL查询获取具有两种food的类foodSource的数据:

SELECT ?food ?foodSource ?foodSource2
WHERE {
  {
    ?foodSource mpasi:data_memerlukanBahan ?memerlukanBahan.
    ?food ?memerlukanBahan ?value.
    FILTER  regex(str(?foodSource),"carrot")
  }
  UNION
  {
    ?foodSource2 mpasi:data_memerlukanBahan ?memerlukanBahan.
    ?food ?memerlukanBahan ?value.
    FILTER  regex(str(?foodSource2),"tomato")
  }
} 
order by ?food

我得到了正确的结果。但后来我想避免一些食物来源。那么,我怎样才能获得没有食物来源的食物呢?例如,我有3种食物:

  • kedelai粥
  • apple crumble
  • 番茄汤

然后我想要里面没有苹果的食物。所以,我很自然地得到了kedelai粥和番茄汤。 我可以使用!regex吗?

FILTER  (!regex(str(?foodSource),"apple")).

1 个答案:

答案 0 :(得分:1)

也许第一步是重构你的UNION声明。前两个三元模式对于UNION图形语句都是相同的,因此将它们移到UNION语句之外。然后你只剩下两个FILTER语句,可以用||表达式重写:

SELECT ?food ?foodSource ?foodSource2
WHERE {
  ?foodSource mpasi:data_memerlukanBahan ?memerlukanBahan.
  ?food ?memerlukanBahan ?value.
  FILTER (regex(str(?foodSource),"carrot") || regex(str(?foodSource2),"apple"))
}

正如@AKSW建议的那样,或许更好的是在正则表达式中执行or

FILTER regex(str(?foodSource),"carrot|apple")

由于SPARQL中的FILTER是一个积极的过滤器 - 它说明要通过什么 - 然后“胡萝卜”和“苹果”是唯一可能的解决方案。 “马铃薯”无法通过过滤器。

但是如果你想找到除“土豆”之外的所有东西,那么你有几个否定的选择:

FILTER (!regex(str(?foodSource),"potato"))

或通过正则表达式否定:

FILTER regex(str(?foodSource),"[^potato]")