我的本体论有两个类: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")).
也许第一步是重构你的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]")