3

ウィキデータの SPARQL エンドポイントから複数の言語でラベルを取得しようとしています。次の例を次に示します

SELECT ?country ?country_EN ?country_DE ?country_FR
   WHERE {
     ?country wdt:P31 wd:Q185441. # member state of the European Union
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en".
            ?country rdfs:label ?country_EN.
     }
     SERVICE wikibase:label { bd:serviceParam wikibase:language "de".
            ?country rdfs:label ?country_DE.
     }
     SERVICE wikibase:label { bd:serviceParam wikibase:language "fr".
            ?country rdfs:label ?country_FR.
     }
}

ここで試してみてください

ただし、これは次のエラーを返します。

不明なエラー: どのグループでも「最後に実行」結合は 1 つだけです

複数の言語でラベルを取得するソリューションはありますか?

4

2 に答える 2

5

別の明示的なヒントがない限り、ラベル サービス オプティマイザーはラベル サービスにヒントを追加します。hint:Prior hint:runLast true

LabelServiceUtils.getLabelServiceNodes(op).forEach(service -> {
    if (service.getProperty(QueryHints.RUN_LAST)  != null ||
        service.getProperty(QueryHints.RUN_FIRST) != null) {
        return;
    }
    service.setProperty(QueryHints.RUN_LAST, TRUE);
});

hint:Prior hint:runLast false最初の呼び出しの後に、すべてのラベル サービス呼び出しに追加する必要があります。

クエリは次のようになります。

SELECT ?country ?country_EN ?country_DE ?country_FR
   WHERE {
     ?country wdt:P463 wd:Q458. # member state of the European Union
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en".
            ?country rdfs:label ?country_EN.
     }
     SERVICE wikibase:label { bd:serviceParam wikibase:language "de".
            ?country rdfs:label ?country_DE.
     } hint:Prior hint:runLast false.
     SERVICE wikibase:label { bd:serviceParam wikibase:language "fr".
            ?country rdfs:label ?country_FR.
     } hint:Prior hint:runLast false.
}

それを試してみてください!

明らかに、通常の SPARQL を使用して複数の言語でラベルをフェッチすることが可能であり、これはあまり冗長ではありません。ただし、ラベル サービスは言語フォールバックを提供します。これには、Q-id への最後のフォールバックが含まれます。

ソース:

于 2018-03-06T11:03:25.873 に答える