sparql - SPARQL 中不区分大小写的 URI 匹配

标签 sparql rdf rdfs

我希望有人可以帮助我处理我正在编写的 SPARQL 查询。我可能会弄错一些术语,我不是 SPARQL 专家。

我正在尝试从诺贝尔奖 SPARQL 端点 (data.nobelprize.org/sparql) 获取一些信息,检索对象标签与特定字符串匹配的谓词标签。

例如,如果我搜索一个 objectLabel 包含字符串“Robert Burns Woodward”的对象,我应该会收到许多结果,包括:

predicateLabel, objectLabel

"Laureate","Robert Burns Woodward"
"LaureateAward","Chemistry 1965, Robert Burns Woodward"
"AwardFile","Nobel Lecture Robert Burns Woodward"

I have written the SPARQL below which should work, however it does not retrieve any results:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT ?predicateLabel ?objectLabel
WHERE 
{  
  ?subject ?predicate ?object .  
  ?object rdfs:label ?objectLabel .
  ?predicate rdfs:label ?predicateLabel .
  FILTER contains(?objectLabel, 'Robert Burns Woodward') 
}

原因是?谓词 URI 与链接到相应 rdfs:label 属性的 URI 的大小写不同。

例如,谓词

http://data.nobelprize.org/terms/nobelPrize

用于将获奖者与他们所赢得的奖项联系起来。例如:

子:http://data.nobelprize.org/resource/laureate/231

预测:http://data.nobelprize.org/terms/nobelPrize

对象:http://data.nobelprize.org/resource/nobelprize/Chemistry/1965

但是,rdfs:label 链接到

http://data.nobelprize.org/terms/NobelPrize

不是

http://data.nobelprize.org/terms/nobelPrize

请注意两者大小写的区别 - 第二个 URI 在 Nobelprize 中使用小写“n”,而第一个 URI 使用大写 N。

所以我的问题是,SPARQL 中有没有办法使 URI 不区分大小写,以便 http://data.nobelprize.org/terms/NobelPrize将与 http://data.nobelprize.org/terms/nobelPrize 匹配?我知道可以使用 FILTER regex 或 FILTER contains 搜索不区分大小写的字符串,但我不知道 URI 是否可以。

最佳答案

我认为你处理这个问题的方式是错误的。该数据源有两个不同的概念。拼写为 NobelPrize 的资源表示诺贝尔奖的类别,如 the ontology 中所示。 。拼写为 nobelPrize 的资源是另一种资源,即获奖者与特定诺贝尔奖之间的关系

换句话说:它们是不同的,故意如此,并且您不应该尝试通过不区分大小写的匹配将它们变成相同的东西。

有点奇怪的是,nobelPrize 属性在 SPARQL 端点中没有标签,因为根据本体文件它应该有一个标签。但考虑到它没有标签,您只能返回谓词 URI 本身。您可以选择使用 strafter 剪切命名空间部分来缩短它,如下所示:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (strafter(str(?predicate), "http://data.nobelprize.org/terms/") as ?predicateLabel) ?objectLabel
WHERE 
{  
  ?subject ?predicate ?object .  
  ?object rdfs:label ?objectLabel .
  FILTER contains(?objectLabel, 'Robert Burns Woodward') 
}

另一种方法稍微复杂一些,但概念上更简洁,它不是返回谓词的名称,而是返回谓词指向的对象类型的名称:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT ?objectClassName ?objectLabel
WHERE 
{  
  ?subject ?predicate ?object .
  ?object a ?objectClass .  
  ?objectClass rdfs:label ?objectClassName .
  ?object rdfs:label ?objectLabel .
  FILTER contains(?objectLabel, 'Robert Burns Woodward') 
}

关于sparql - SPARQL 中不区分大小写的 URI 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47846563/

相关文章:

sparql - 如何按名称一致地查询 dbpedia 中的编程语言?

sparql - DBPedia SPARQL <LONG::IRI_RANK>

python - 使用 SPARQL 进行有限的 RDFS 和 OWL 推理

java - 使用 xml 文件中的 jena 创建 RDF 三元组和 RDF 存储

java - 如何检索 OWLapi 中专用类的子类?

optimization - 在 MarkLogic 中优化 SPARQL 查询

rdf - 如何在OWL中定义属性的域?

java - 如何获取代表具有特定 [property,object] 对的对象的 RDF 资源?

sparql - 三重存储中的开放世界假设和 SPARQL

rdf - 为什么一个类写成 rdfs :Class and a property is written as rdf:Property