我是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>
这是我正在编写的查询,但是它不返回任何内容,而且我似乎找不到一种方法来指定主题应包含“ var1”:
SELECT ?t
WHERE {
?s rdf:type ?t
FILTER regex(?s, "var1")
}
我希望能以正确的方式获得帮助。
答案 0 :(得分:2)
主题不是字符串文字值,而是IRI:http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1
。为此,您不应使用正则表达式,而应使用实际的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
}
答案 1 :(得分:2)
另一个答案已经指出,您的?s
是URI,应该直接匹配而不是使用正则表达式。另外,需要记住的是,如果定义了正确的前缀,匹配特定的URI会变得更加简单。如果我们为文件的URI定义前缀,那么实际的查询模式将变得更加简单:
PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>
SELECT ?t
WHERE {
fred:var1 rdf:type ?t
}
查询可以变得更加简单:rdf:type
具有内置缩写“ a
”,而WHERE
关键字是可选的:
PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>
SELECT ?t {
fred:var1 a ?t
}
最后,如果您真的想使用正则表达式来匹配URI,则可以通过使用str
将URI转换为字符串来实现:
SELECT ?t {
?s a ?t
FILTER regex(str(?s), "var1")
}
但是与其他选项相比,在较大的数据集上这将非常慢。
最后,为了支持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.