2012-07-06 10 views
5

正規表現フィルタを使用してSPARQLの単語を1つ一致させようとしていますが、成功しません:/ "http://dbtune.org/"にあるエンドポイントにクエリを送信していますmusicbrainz/sparql "と入力します。 さて、次のクエリが動作します。SPARQL regex filter

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX mo: <http://purl.org/ontology/mo/> 
SELECT ?artist ?name 
WHERE { 
    ?artist a mo:MusicArtist 
    . ?artist foaf:name "Switchfoot" 
    . ?artist foaf:name ?name 
    . FILTER(regex(str(?name), "switchfoot", "i")) 
} 

しかし、私はライン7(アーティストFOAF。?:名称 "スウィッチフット")を削除した場合、次のクエリが一致していませんが:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX mo: <http://purl.org/ontology/mo/> 
SELECT ?artist ?name 
WHERE { 
    ?artist a mo:MusicArtist 
    . ?artist foaf:name ?name 
    . FILTER(regex(str(?name), "switchfoot", "i")) 
} 

私は私が間違って何かをしているのか、それともエンドポイントのバグなのか分かりません...

誰か助けてもらえますか?

+0

これは、(あなたが言うように)バグか何らかの種類のクエリスロットルのいずれかを襲う。彼らはどのエンドポイントを使用しているのだろうか? – user205512

+0

エンドポイントは "http://dbtune.org/musicbrainz/sparql"です... 私はテストを行いました。そのエンドポイントで結果が1000に制限されていることに気付きました。次のクエリを送信しました: SELECT count(?アーティスト) WHERE {?artist a mo:MusicArtist} それは1000を返したが、小さすぎると... おそらくバグだと思うかもしれない... =/ –

答えて

7

2番目のクエリでは、インデックスを作成するグラフパターンはありません。クエリプロセッサがそのクエリを満たすことができる唯一の方法は、の名前をトリプルストア内の単一のアーティストごとに取得し、それぞれに正規表現の一致を適用することです。それがCPU時間であろうと経過した時間であろうと、ある種のリソース制限を打つことは間違いありません。

フリーテキスト検索を行う場合は、データセットをローカルエンドポイントにダウンロードし、LARQなどのフリーテキストインデックスを使用することをお勧めします。あなたの質問はより速くなり、あなたのユーザーはそれに感謝します!

+0

ありがとう、イアン! –

+0

"name"、 "label"などの正規表現と一致する必要があるデータだけを格納するサーバーを作って、自分のサーバーでリソースURIを取得できるようにします他のプロパティを取得するためにそれを使用してください! –