2016-05-14 2 views
0

私のオントロジは2つのclassessを持っています。クラス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 

を使用してfoodSourceの2種類のデータの食べ物を取得したいです。しかし、私はいくつかの食物源を避けたい。だから、どうすれば食べ物がなくても食べることができますか?例えば、私は3種類の食べ物を持っています: - kedelaiお粥 - apple crumble - トマトスープ 私はそれの中にリンゴのない食べ物をしたいです。そう、自然に私はちょうどkedelaiお粥とトマトスープを取得します。 !regexを使って入手できますか?

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

正規表現がある労働組合と否定をサポートしていますが、すべてのものが、「ポテト」を見つけたい場合は

、あなたは否定の選択肢のカップルを持っていますおそらくSPARQL共用体とMINUSを介して書くよりも効率的です。 – AKSW

答えて

1

おそらく最初のステップは、UNIONステートメントをリファクタリングすることです。最初の2つのトリプルパターンは、両方のUNIONグラフステートメントで同じですので、UNIONステートメントの外に移動してください。そして、あなたは||式に書き換えることができ、わずか2 FILTER文、と左している:@AKSWが示唆するように、おそらくより良い

、正規表現自体にorを実行することである。

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

SPARQLのFILTERは肯定的なフィルタであるため、何を通過させるかが記述されているため、「ニンジン」と「リンゴ」が唯一の解決策です。 「ジャガイモ」はフィルターを通過できません。

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

または正規表現否定経由:

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

''^potato "]'には、いくつかの不均衡な括弧/引用符があります。しかし、それでも、私はあなたが望むことをしないと思う。私は ''^potato 'はp、o、t、またはaでない単一の文字にちょうどマッチすると思う。 –

+0

タイプミスを修正しました。正規表現は正しいです。文字クラス '^'の中で文字列を否定します。 – scotthenninger

+0

私はネゲートを知っていますが、 '[abc]'はbとcの1文字にマッチします。 '[^ abc]'はbやc以外の文字にマッチしませんか? –