2016-05-13 3 views
0

多くのプレフィックスを使用するリソースを持つデータセットがあります。私は、2つの特定の接頭辞からではないすべてのリソースを探したい。sparql特定のプレフィックス以外のすべてのサブジェクトを取得する

私はこのクエリを実行:

strafter(str("http://www.first.com/to#test")は私にtestないhttp://www.first.com/to#を与えるので、うまくいきませんでした

select * 
where 
{ 

?s ?p ?o . 
    bind (strafter(str(?s), "#") as ?prefix) 
    filter (?prefix != "http://www.first.com/to#") 
    filter (?prefix != "http://www.second.com/rs#") 
} 
limit 10 

誰かがプレフィックスを取得する方法を知っていますか?

+0

この方法では、[strafter](https://www.w3)ではなく、[strbefore](https://www.w3.org/TR/sparql11-query/#func-strbefore)が必要です。 org/TR/sparql11-query /#func-strafter)。 'strbefore(" abc "、" b ")=>" a "'と 'strafter(" abc "、" b ")=>" c "'の例をドキュメントに示しています。 –

+0

@JoshuaTaylorこんにちは、コメントのおかげで、私はあなたが/それを知っているかもしれないメタに関する質問をしました:) https://meta.stackoverflow.com/questions/323271/how-to-give-minimum-example-when私の問題は、データのサイズは、あなたが助けてくれますか? –

+0

これは大規模なデータセットに対してヌル・パンター例外が発生する設定ですか?いくつかのuriが 'http:// example.org/foo/bar'という形式をしている、つまり'# 'がない場合、驚くことはありません。期待している。 (それはちょうど一般的な推測ですが、ここで何が起きているのかは必ずしもありません) –

答えて

0

STRBEFOREが有効です。すなわち:

select * 
where 
{ ?s ?p ?o . 
    BIND(STRBEFORE(str(?s), "#") as ?prefix) 
    FILTER (?prefix != "http://www.first.com/to") 
    FILTER (?prefix != "http://www.first.com/rs") 
} 

か、使用できSTRSTARTS

select * 
where 
{ ?s ?p ?o . 
    FILTER (!(STRSTARTS(str(?s), "http://www.first.com/to#"))) 
    FILTER (!(STRSTARTS(str(?s), "http://www.first.com/rs#"))) 
} 

regexも使用することができます:URIはスラッシュまたはハッシュで終了できるようになる

select * 
where 
{ ?s ?p ?o . 
    FILTER (!(regex(str(?s), "http://www.first.com/to|http://http://www.first.com/rs[#/]"))) 
} 

...それが懸念されている場合。

+0

これは一つのオプションですが、他の慣習が接頭辞(例えば、スラッシュ)。 ** strstarts **を使用して、文字列が特定の接頭辞で始まるかどうかを確認することもできます。 –

+0

OPは特に '# 'を使用して依存していました。私は通常、strstartsを使うので、それも追加します。 – scotthenninger

+0

@scotthenningerを 'STRSTARTS'オプションに指定すると、それは他の2つのオプションにあるように、否定されたFILTER式ですか? –

関連する問題