2016-05-14 24 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的字符? –