2017-02-10 5 views
1

私はすべての映画タイトルを別名で検索しようとしています。私は(OFFSET増加に伴って)これらのようなクエリを使用していますし、最初は動作するようです:SPARQLを使用してWikidataからすべての映画タイトルを取得する際の問題

SELECT ?itemLabel ?itemAltLabel WHERE { 
    ?item wdt:P31 wd:Q11424. 
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } 
} 
LIMIT 1000 
OFFSET 0 

それが有効なムービータイトルの多くを取得しますが、一部が欠落している、私はウィキデータをサイト上でそれらを見つけることができますが、 。私はITEMLABEL、. ?itemLabel = 'fight club'のようなものでフィルタリングする、デバッグのために

  • :私は、クエリ(私はSPARQLに新たなんだ)にいくつかの変更を行うために管理することはできません。私はさまざまな選択肢を試しましたが、どれも成功しませこのようなクエリを作成するのを手伝ってもらえますか?
  • itemLabelを持たないムービーを除外します。これらは現在IDをitemLabelとして返します。 "Q12345"。 . ?itemLabel != ""のようなものを追加するにはどうすればよいですか?それとも、どういうわけか. ?itemLabel NOT LIKE 'Q[0-9]+'でしょうか?
  • ソート:欠落しているタイトルが注文を追加していない可能性があるのだろうか。私はLIMIT 1000でクエリを実行し、結果がなくなるまで1000でオフセットを増やしています。並べ替えはクエリ間で変更できますか?もしそうなら、私はちょうどORDER BY ?refNameを加えるべきですか?

私はいくつかの愚かな構文ミスをしている可能性がありますので、完全に動作するクエリを提供してください。利用可能なタイトルをすべて取得できないと思われるものが他にもある場合は、教えてください。

私はここにクエリを実行している:https://query.wikidata.org/

+2

インスタンスを知っている場合は、デバッグにラベルを使用しないでください。 'FILTER(?item = wd:Q190​​050)'を使うと動作します。あなたがすでに認識しているように、 'ORDER BY'がなければ、あなたのコメントのために' LIMIT n OFFSET n' – AKSW

+0

@AKSWのページネーションを使ってすべての結果を得るという保証はありません。私が 'item'または' itemLabel'を 'ORDER BY BY 'しようとすると、ほとんどの場合タイムアウトします。私が使うことができる他のフィールドはありますか?タイムアウトしませんか? MySQLでは、私はインデックスフィールドを使用します。 –

+1

通常、トリプルストアは、件名、述語(p)およびオブジェクト(o)の索引を持ちますが、いくつかの順列では頻繁に使用されます。あなたの場合、 'pos'が使われます。それにもかかわらず、「ORDER BY」は高価であり、実際には回避策はない。これは共有リソースなので、パフォーマンスは制限される可能性があることに注意してください。ところで、あなたのユースケースは何ですか?たぶんあなたは自分のローカルトリプルストアにデータをロードすることができます。 – AKSW

答えて

3

を、私は映画を扱うときに特に前に、この問題が発生してきました:)私は何が起こっていることは、特定のエンティティがフィルムのサブカテゴリのインスタンスであるということだと思います。あなたは以下を使用します:

?item wdt:P31/wdt:P279* wd:Q11424 .

あなたは何かがある場合ので、「映画」思い付くまで、たとえば、トイ・ストーリー(Q171048)のようなアニメーション映画の連鎖「のインスタンス」をナビゲートするために - どのフィルムのサブクラスです - それは元のクエリによって返されません。

希望に役立ちます!

関連する問題