2016-05-14 87 views
0

我的本体有2个分类。类别food和类别foodSource。 我想获得的数据的食品用SPARQL过滤器正则表达式和联合

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 

2种foodSource的我得到正确的结果。但是,我想避免一些食物来源。那么,如何在没有食物来源的情况下获得食物?例如我有3种食物: - kedelai粥 - 苹果碎 - 番茄汤 然后我想要没有苹果的食物在里面。所以,我自然会得到kedelai粥和番茄汤。 我可以使用它!正则表达式?

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

正则表达式支持工会和否定这是可能比通过SPARQL联合和MINUS编写更高效。 – AKSW

回答

1

也许第一步是重构您的UNION声明。前两个三元模式对于UNION图形语句都是相同的,因此请移动UNION语句之外的那些模式。那么你只剩下两个FILTER语句,可以重新编写与||表达:

也许更好,因为@AKSW建议,是在正则表达式本身进行or

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

由于SPARQL中的FILTER是一个正滤镜 - 它声明了要通过什么 - 然后“胡萝卜”和“苹果”是唯一可行的解​​决方案。 “土豆”不能通过过滤器。

不过,如果你想找到的一切,但“土豆”,那么你有一对夫妇的否定选择:

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

或通过正则表达式的否定:

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

'“[^ potato”]'有一些不平衡的括号/引号。但即便如此,我也认为那不符合你的要求。我认为'[^土豆]'只是匹配不是p,o,t或a的单个字符。 –

+0

修复了错字。正则表达式是正确的。在字符类里'^'否定字符串。 – scotthenninger

+0

我知道否定,但'[abc]'匹配b和c中的一个字符; [^ abc]不匹配一个不是b或c的字符? –