我的本体有两个课程: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粥和番茄汤。 我可以使用!regex吗?
FILTER (!regex(str(?foodSource),"apple")).
答案 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]")