20

私はこのように見えるいくつかのトリプルを持っています:

test:thing rdfs:label "Non-Language Label"
test:thing rdfs:label "English Label"@en
test:thing rdfs:label "French Label"@fr

「非言語ラベル」と「フランス語ラベル」(存在する場合)を取得するsparqlクエリを作成したいと思います。

私はこれを試しましたが、機能していません:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel
WHERE {
   test:thing rdfs:label ?label 
   OPTIONAL {
     test:thing rdfs:label ?preferredLabel . 
     FILTER (regex(str(?preferredLabel), '(^|\\\\W)fr', 'i'))
   }
}

前もって感謝します!

4

3 に答える 3

25

なぜここが必要なのか全くわかりませんOPTIONALtest:thing外側のパターンとオプションの間に共有変数がないため、Janのクエリは失敗します。そのため、巨大な可能性のあるすべての非/フランス語のラベルtest:thingと、クエリプロセッサが失敗する理由について、すべてのラベルの外積を計算しようとして います。

私があなたの質問を誤解していない限り、あなたは単に次のようなものが欲しいです

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label
WHERE 
{
   test:thing rdfs:label ?label 
   FILTER(LANG(?label) = "" || LANGMATCHES(LANG(?label), "fr"))
}

2つのラベルを別々に使用したい場合は、次のようにすることができます。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel
WHERE 
{
  {
   test:thing rdfs:label ?label . FILTER(LANG(?label) = "")
  }
  UNION
  {
   test:thing rdfs:label ?preferredLabel . FILTER(LANGMATCHES(LANG(?label), "fr"))
  }
}
于 2011-10-29T15:37:29.423 に答える
6

リテラルの言語をチェックする最も簡単な方法は、lang()関数を使用することです。これを使用すると、クエリは次のように記述できます。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX test: <http://test#> 
SELECT ?label ?preferredLabel 
WHERE { 
   test:thing rdfs:label ?label 
   OPTIONAL { 
     test:thing rdfs:label ?preferredLabel . 
     FILTER (lang(?preferredLabel) = "" || lang(?preferredLabel) = "fr") 
   } 
}
于 2011-10-29T08:33:35.327 に答える
2
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?uri ?label ?preferredLabel
WHERE 
{
  {
   ?uri rdfs:label ?label . FILTER(LANG(?label) = "" && regex(str(?label), '(^|\\\\W)fr', 'i'))
  }
  UNION
  {
   ?uri rdfs:label ?preferredLabel . FILTER(LANG(?preferredLabel) = "fr" && regex(str(?preferredLabel), '(^|\\\\W)fr', 'i'))
  }
}
于 2011-10-29T16:23:45.187 に答える