Rdf SPARQL选择可选语言

Rdf SPARQL选择可选语言,rdf,sparql,owl,triplestore,Rdf,Sparql,Owl,Triplestore,我有一些看起来像这样的三元组: 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

我有一些看起来像这样的三元组:

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'))
   }
}
前缀rdfs:
选择?标签?首选标签
在哪里{
测试:事物rdfs:标签?标签
可选的{
测试:事物rdfs:标签?首选标签。
过滤器(正则表达式(str(?preferredLabel),'(^ | \\\\W)fr',i'))
}
}

提前谢谢

检查文字语言的最简单方法是使用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") 
   } 
}
前缀rdfs:
前缀测试:
选择?标签?首选标签
何处{
测试:事物rdfs:标签?标签
可选{
测试:事物rdfs:标签?首选标签。
过滤器(lang(?preferredLabel)=“lang(?preferredLabel)=“fr”)
} 
}

我完全不明白您为什么需要
可选的
。Jan的查询失败了,因为外部模式和可选模式之间没有共享变量,所以您试图计算
test:thing
的每个标签与每个非法语标签的
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"))
}
前缀rdfs:
选择?标签
哪里
{
测试:事物rdfs:标签?标签
过滤器(LANG(?label)=“LANGMATCHES”(LANG(?label),“fr”))
}
如果希望两个标签分开,则可以执行以下操作:

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"))
  }
}
前缀rdfs:
选择?标签?首选标签
哪里
{
{
test:thing rdfs:label?label.FILTER(LANG(?label)=“”)
}
联合
{
test:thing rdfs:label?preferredLabel.FILTER(LANGMATCHES(LANG(?label),“fr”))
}
}
前缀rdfs:
选择?uri?标签?首选标签
哪里
{
{
uri rdfs:label?label.FILTER(LANG(?label)=“&®ex(str(?label),”(^ | \\\\W)fr,,“i”))
}
联合
{
?uri rdfs:label?preferredLabel.FILTER(LANG(?preferredLabel)=“fr”和®ex(str(?preferredLabel),'(^ | \\\\W)fr',i'))
}
}

您好-谢谢您的帮助。您在某处添加了过滤逻辑,这看起来不错。不过,这个查询对我来说是错误的。我认为问题始于我基本上选择了两次相同的数据(作为?标签和作为?首选标签)。我想把?标签和?首选标签放在同一个记录中。在这一点上,我有点困惑——看似简单,但并非如此!谢谢你的帮助
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'))
  }
}