Select SPARQL根据主题的内容进行选择

Select SPARQL根据主题的内容进行选择,select,sparql,rdf,Select,Sparql,Rdf,我是SPARQL新手,我正在尝试根据主题的内容选择一个属性。例如,使用下面的RDF数据,我想返回包含var2_1的结果: <rdf:Description rdf:about="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var0"> <rdf:type rdf:resource="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#v

我是SPARQL新手,我正在尝试根据主题的内容选择一个属性。例如,使用下面的RDF数据,我想返回包含var2_1的结果:

<rdf:Description rdf:about="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var0">
    <rdf:type rdf:resource="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var2_0"/>
</rdf:Description>
<rdf:Description rdf:about="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1">
    <rdf:type rdf:resource="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var2_1"/>
</rdf:Description>

如果您能提供正确的帮助,我将不胜感激。

主题不是字符串文字值,而是IRI:http://www.ontologydesignpatterns.org/ont/fred/domain.owlvar1. 要匹配这一点,不应使用正则表达式,而应使用实际的IRI本身:

SELECT ?t 
WHERE {
  ?s rdf:type ?t
  FILTER(?s =  <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1>)
}
或者更简洁地说:

SELECT ?t 
WHERE {
   <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1> rdf:type ?t
}

主题不是字符串文字值,而是IRI:http://www.ontologydesignpatterns.org/ont/fred/domain.owlvar1. 要匹配这一点,不应使用正则表达式,而应使用实际的IRI本身:

SELECT ?t 
WHERE {
  ?s rdf:type ?t
  FILTER(?s =  <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1>)
}
或者更简洁地说:

SELECT ?t 
WHERE {
   <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1> rdf:type ?t
}

另一个答案已经指出,您的?s是一个URI,应该直接匹配,而不是使用正则表达式。此外,值得记住的是,如果定义了正确的前缀,那么匹配特定URI会变得更简单。如果我们为文件的URI定义一个前缀,那么实际的查询模式就会变得简单得多:

PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>
SELECT ?t 
WHERE {
   fred:var1 rdf:type ?t
}
最后,如果确实希望使用正则表达式匹配URI,可以使用str将URI转换为字符串:

但与其他选项相比,在较大的数据集上,这将非常缓慢

最后,为了支持AKSW的评论,下面是从RDF/XML转换为Turtle的文件:

PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>

fred:var0 a fred:var2_0.
fred:var1 a fred:var2_1.

另一个答案已经指出,您的?s是一个URI,应该直接匹配,而不是使用正则表达式。此外,值得记住的是,如果定义了正确的前缀,那么匹配特定URI会变得更简单。如果我们为文件的URI定义一个前缀,那么实际的查询模式就会变得简单得多:

PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>
SELECT ?t 
WHERE {
   fred:var1 rdf:type ?t
}
最后,如果确实希望使用正则表达式匹配URI,可以使用str将URI转换为字符串:

但与其他选项相比,在较大的数据集上,这将非常缓慢

最后,为了支持AKSW的评论,下面是从RDF/XML转换为Turtle的文件:

PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>

fred:var0 a fred:var2_0.
fred:var1 a fred:var2_1.

资源由URI标识,您知道URI,那么为什么要使用正则表达式呢?您是否考虑了特定的用例?我的意思是,有一些罕见的情况下,你不知道完整的URI,但只要你事先知道它,它是更好的方式遵循下面的答案。此外,SPARQL引擎的效率更高,因为它可以使用一些数据库索引。如果您使用Turtle语法查看您的数据,这将非常有帮助,它与SPARQL查询语法非常接近。非常好,谢谢AKSW,我将查看Turtle!资源由URI标识,您知道URI,那么为什么要使用正则表达式呢?您是否考虑了特定的用例?我的意思是,有一些罕见的情况下,你不知道完整的URI,但只要你事先知道它,它是更好的方式遵循下面的答案。此外,SPARQL引擎的效率更高,因为它可以使用一些数据库索引。如果您使用Turtle语法查看您的数据,这将非常有帮助,它与SPARQL查询语法非常接近。非常好,谢谢AKSW,我将查看Turtle!谢谢Jeen,这很有帮助!谢谢Jeen,这很有帮助!