2016-06-30 5 views
2

ORフィルタSPARQL命令で、単語の順序が優先順位を与えたり変更したりするかどうかを知りたいです。例えばSPARQL ORフィルタ命令に優先順位はありますか?

FILTER(regex(STR(?keywords), "test1", "i") 
     || regex(STR(?keywords), "test2", "i") 
     || regex(STR(?keywords), "test3", "i") 
     || regex(STR(?keywords), "test4", "i") 
     || regex(STR(?keywords), "test5", "i")) 

は、このクエリはtest1のは、結果のフィルタリングでTEST2よりも優先順位を有することを示していますか?つまり、結果の順序に影響しますか?結果を合計(たとえば60とします)よりも低いたとえば20に制限している場合は、test1を最初に取得し、次にtest2の結果を得られますか?

そうでない場合は、そのような優先順位を確立する方法はありますか?

+0

何「優先度の高い」結果がででしょうか?フィルタの引数はデータを変更しないので、その順序は結果に影響を及ぼしません(パフォーマンスは多分ですが)。 – Sirko

+0

@Sirko申し訳ありませんが私の質問は完全ではなかった、私はそれを更新します。私は結果を例えば20に制限していると付け加えます。 20以上の場合は、最初にtest1の結果を取得しますか? – M20

+0

私は、これを指定するための標準に何かがあるとは思わない。一部のエントリに優先順位を付ける場合は、ORDER句を使用する必要があります。 – Sirko

答えて

7

このクエリは、 の結果で、test1がtest2よりも優先度が高いことを示していますか?言い換えれば、それは結果の の順序に影響を及ぼしますか?私が の例が合計(より少ないと言えば60)の場合の結果を20に制限している場合は、最初にtest1の結果を にしますか?

クエリの最後にによって何順序はありません場合は、注文は、指定されていないので、実装は確かにフィルタに基づいて順序を変更することができますが、それは特にそう思われないに少なくとも明らかな方法ではない。あなたが質問すると、「最初にtest1の結果を得てから次にtest2を得ますか?」という質問に対して、のフィルタについての誤解を示唆しています。 フィルタは、結果セットに含めるために結果が満たす必要のある条件を指定する方法です。概念的には、フィルタの前に、結果セットに結果リストがあり、フィルタテストがそれぞれ適用され、テストを満たすものが保持されます。意味のある意味でのtest1またはtest2の「結果」はありません。例えば、順序に影響を与える可能性のテストを適用しているかどうかに応じて、さまざまな方法:最終結果以来

final results = {} 
for (result in working results) 
    for (testi in tests) 
    if result passes test 
     add result to final results 

または

final results = {} 
for (testi in tests) 
    for (result in working results) 
    if result passes test 
     add result to final results 

設定では、あなたが同じで終わるだろう結果は最終的にリストとして提供されるため、結果が表示される順番に影響を与える可能性が考えられます。しかし、上記のように、信頼性の高い意味のある違いはありません。

このような優先順位を設定する方法はありますか?

あなたはため何らかの方法で結果にしたい場合は、その優先順位を取得する方法を見つけ出す必要があります、その後、あなたはそれで注文することができます。 の値があるため、この場合

select ?keywords { 
    values ?test { "test1" "test2" "test3" } 
    #-- get a binding for ?keywords... 
    filter regex(str(?keywords), ?test) 
} 
order by ?test 

:たとえば、あなたのケースでは、あなたのような何かをするだろうか?テストは信頼性の高いオーダーを持っていますが、?testのどの値が一致しているかに基づいて結果を注文することができます。もちろん?キーワード?テストの複数の値と一致する場合は、結果に複数回表示されます。

基準は、文字列のように単純ではない場合、あなたはまだ優先順位を指定するには、を使用することができます。

select ?keywords { 
    values (?test ?priority) { ("test1" 3) ("test2" 0) ("test3" 5)} 
    #-- get a binding for ?keywords... 
    filter regex(str(?keywords), ?test) 
} 
order by ?priority 
関連する問題