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

SPARQL中不区分大小写的URI匹配,sparql,rdf,rdfs,Sparql,Rdf,Rdfs,我希望有人能帮我写一个SPARQL查询。我可能会弄错一些术语,我不是SPARQL专家 我试图从诺贝尔奖SPARQL端点(data.nobelprize.org/SPARQL)获取一些信息,检索对象标签与特定字符串匹配的谓词标签 因此,例如,如果我搜索一个objectLabel包含字符串“Robert Burns Woodward”的对象,我将收到大量结果,包括: predicateLabel, objectLabel "Laureate","Robert Burns Woodward" "La

我希望有人能帮我写一个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" 谓词标签,对象标签 “桂冠得主”,“罗伯特·伯恩斯·伍德沃德” “诺贝尔化学奖”,“1965年化学奖,罗伯特·伯恩斯·伍德沃德” “获奖文件”,“诺贝尔演讲罗伯特·伯恩斯·伍德沃德” 我已经在下面编写了SPARQL,它应该可以工作,但是它没有检索到任何结果:

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') 
}
前缀rdfs:
前缀rdf:
选择“谓词标签”对象标签
哪里
{  
主语?谓语?宾语。
?对象rdfs:标签?对象标签。
谓词rdfs:标签?谓词标签。
过滤器包含(?objectLabel,‘Robert Burns Woodward’)
}
原因是?谓词URI与链接到相应rdfs:label属性的URI的情况不同

例如,谓词

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

分:

pred:

obj:

但是,rdfs:标签链接到

不是

请注意两者之间大小写的区别——第二个URI在nobelprize中使用小写“n”,而第一个URI使用大写“n”


所以我的问题是,在SPARQL中有没有一种方法可以使URI不区分大小写,以便与匹配?我知道可以使用FILTER regex或FILTER contains搜索不区分大小写的字符串,但我不知道是否可以使用uri

我认为你的做法是错误的。该数据源有两个独立的概念。拼写为
NobelPrize
的资源表示诺贝尔奖的类别,如中所示。拼写为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') 
}
前缀rdfs:
前缀rdf:
选择(strafter(str(?谓词),”http://data.nobelprize.org/terms/)作为谓词标签)对象标签
哪里
{  
主语?谓语?宾语。
?对象rdfs:标签?对象标签。
过滤器包含(?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') 
}
前缀rdfs:
前缀rdf:
选择?objectClassName?objectLabel
哪里
{  
主语?谓语?宾语。
?对象a?对象类。
?对象类rdfs:标签?对象类名称。
?对象rdfs:标签?对象标签。
过滤器包含(?objectLabel,‘Robert Burns Woodward’)
}

那么你必须使用字符串。SPARQL在字符串上有类似于
LCASE
的函数,以使其小写:
LCASE(str(?uri_var))
并将其用于过滤器或将其绑定到某个新变量。谢谢您。我已经实现了第二个选项,它完全符合我的要求。非常感谢。