2016-05-02 4 views
1

a previous questionからいくつかの成功を収めていますが、一部の(ただしすべてではない)エントリでは他のDBpedia言語の結果を取得できません。例えばSPARQLが返さないowl:sameAsプロパティ(DBpediaにある)

SELECT * WHERE { 
    VALUES ?label {"Acid Rain"@en "Chocolate"@en} 
    ?en rdfs:label ?label . 
    optional { ?en owl:sameAs ?es . FILTER regex(str(?es), "es.dbpedia") } 
    filter not exists {?en a skos:Concept} 
} 

戻り

{ "head": { "link": [], "vars": ["label", "en", "es"] }, 
    "results": { "distinct": false, "ordered": true, "bindings": [ 
    { "label": { "type": "literal", "xml:lang": "en", "value": "Chocolate" } , "en": { "type": "uri", "value": "http://dbpedia.org/resource/Chocolate" } , "es": { "type": "uri", "value": "http://es.dbpedia.org/resource/Chocolate" }}, 
    { "label": { "type": "literal", "xml:lang": "en", "value": "Acid Rain" } , "en": { "type": "uri", "value": "http://dbpedia.org/resource/Acid_Rain" }} ] } } 

"Acid Rain"スペイン結果が存在しません。しかし、http://dbpedia.org/page/Acid_rainowl:sameAsセクションには、スペイン語の結果が明確に表示されており、それはhttp://es.dbpediaで始まります。

なぜDBpedia SPARQLエンドポイントは、DBpediaに明確にリストされている場合、owl:sameAs結果を戻さないのですか?

+0

私は '(owl:sameAs |^owl:sameAs)+'を使っていくつかの成功を収めました。それは間違いなくAcid_Rainのスペイン語の対応を引き上げます。しかし、複数の言語を同時に取得しようとすると、 'optional {?en(owl:sameAs |^owl:sameAs)+? FILTER regex(str(?es)、 "es.dbpedia")} optional {?en(owl:sameAs |^owl:sameAs)+?pt。 'のVirtuoso 37000エラーSP031:SPARQLコンパイラ:変数 '_ :: trans_subj_6_2は、' クエリの部分式に使用されるがassigned'されていない - FILTERの正規表現(?STR(PT)、 "pt.dbpedia")}'私はこのエラーを取得します – Justin

+1

それはVirtuosoのバグです。 Githubリポジトリのチケットを開くか、またはメーリングリストに投稿して修正することができます。 – AKSW

+0

@AKSWは、あなたが '意味ですか(フクロウ:sameAsのを| ^フクロウ:sameAsの):Acid_Rain'プレーン'フクロウを使って:+ '述語は、バグやDBR'の結果の欠如であるsameAs'はバグでしょうか? – Justin

答えて

2

私は複数のオプションが働いたはずだと思います。コメントに@ASKWが示唆したVirtuosoの問題でしょうか?

あなたは、単一の正規表現の文で、例えば、異なる言語を得ることができる必要があります:

FILTER regex(str(?es), "(es|pt).dbpedia") } 

あなたはラベルのスペイン語と他の言語バージョンを探しているだけの場合には、簡単な方法がありますこれを行う。その場合は、次のことを試してください。

SELECT * 
WHERE { 
    VALUES ?label {"Acid Rain"@en "Chocolate"@en} 
    ?en rdfs:label ?label . 
    ?en rdfs:label ?allLabels . 
    FILTER (lang(?allLabels) = "es") 
} 

は、それが効果的に探索空間を増加させるのでOPTIONALは高価なことができることに注意してください。必要な場合を除き避けてください。オプションの場合は必要ありません。

もう1つの解決方法BTWは、CONTAINS()を使用してフィルタリングすることです。

+0

これは、ラベルのついたトリックです!私は実際にはDBpedia URIが必要です。我々はいくつかの国際的なユーザーがいる、と私は正しいDBpediaのリンクが自動的に表示されるように引っ張ってくるユーティリティをコーディングしています。 – Justin

+0

正規表現をこのようにすると、別々のフィルタではうまくいかない理由を説明できますか?私はそれがどのように動作するのかを理解したいと思います。特に、データを正規化解除するためのコードを書くつもりです。 – Justin

+0

私は複数のオプションが機能していたはずだと思います。おそらくVirtuosoの問題? Optionalsは、彼らが効果的に探索空間を増やすので、必要な場合を除き、それらを避けるため、高価になることができ、そしてあなたのケースではオプションは必要ありません。もう一つの解決方法は、 'CONTAINS()'を使ってフィルターをかけることです。 – scotthenninger

関連する問題