5

クエリによって返されたウィキデータ リソースに、フィルター処理した言語で使用できるラベルがない場合、空のセルが取得されました。

SELECT *
WHERE
{
    ?country wdt:P31 wd:Q6256.
    ?country rdfs:label ?country_name
        FILTER(LANG(?country_name) = 'jbo').
}

リンク

最初の言語が失敗した場合、使用可能な言語のいずれかでラベルを返すように要求する方法は?

4

1 に答える 1

5

まず、言語タグのチェックにはlangMatchesを優先します。たとえば、英語のラベルが必要な場合があり、langMatches(lang(?label), "en")はタグ「en」または「en-GB」を持つラベルを見つけるため、これは特に重要です。 "、または "en-US" など。これらは言語の地域的なバリエーションであり、langMatchesを使用するとそれらを見つけることができます。

コメントに基づいて更新されたソリューション

@svick は、コメントで、元のソリューションでは、英語名と英語以外の名前のデカルト積の各要素が 1 行で終わることに気付きました。select distinctを使用することでこれを回避できます。しかし、実際にはもっと良い方法があります。2 つのオプションの s で同じ変数を使用するだけです。1 つ目は英語のラベルをチェックし、2 つ目は英語以外のラベルをチェックします。1 つ目が成功した場合、2 つ目が呼び出されることはありません。つまり、次のようにします。

select ?country ?label {
   ?country wdt:P31 wd:Q6256 
   optional { 
     ?country rdfs:label ?label
     filter langMatches(lang(?label), "en")
   }
   optional { 
     ?country rdfs:label ?label
   }
}

その他のオプション



COALESCE による独自のソリューション

ただし、その後は、coalesceを使用すると、必要なことが行われます。いくつかの引数を取り、値を持つ最初の引数を返します。したがって、任意のブロックで優先言語を一致させ、別のブロックで任意の言語を一致させ、値を合体させることができます。

select distinct ?country (coalesce(?enLabel, ?anyLabel) as ?label) {
   ?country wdt:P31 wd:Q6256 
   optional { 
     ?country rdfs:label ?enLabel
     filter langMatches(lang(?enLabel), "en")
   }
   optional { 
     ?country rdfs:label ?anyLabel
   }
}
于 2016-07-13T12:57:04.227 に答える