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

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

我的本体论有两个类:food foodSource。我想使用SPARQL查询获取具有2种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粥和番茄汤。我可以使用它!正则表达式?

FILTER  (!regex(str(?foodSource),"apple")).
sparql ontology
1个回答
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]")
© www.soinside.com 2019 - 2024. All rights reserved.