繁体   English   中英

SPARQL根据主题内容选择

[英]SPARQL select based on the content of the subject

我是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")
}

我将以正确的方式为您提供帮助。

该主题不是字符串文字值,而是IRI: http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1 : 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
}

另一个答案已经指出您的?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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM