SPARQL select 基于主题的内容
SPARQL select based on the content of the subject
我是 SPARQL 的新手,我正在尝试根据主题的 内容 select 属性。例如,使用下面的 RDF 数据,我想 return 包含 "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>
这是我正在写的查询,但它 return 没什么,而且我似乎无法找到一种方法来指定主题应包含 "var1":
SELECT ?t
WHERE {
?s rdf:type ?t
FILTER regex(?s, "var1")
}
如果能以正确的方式执行此操作,我将不胜感激。
主题不是字符串文字值,而是 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
}
另一个回答已经指出你的?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.
我是 SPARQL 的新手,我正在尝试根据主题的 内容 select 属性。例如,使用下面的 RDF 数据,我想 return 包含 "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>
这是我正在写的查询,但它 return 没什么,而且我似乎无法找到一种方法来指定主题应包含 "var1":
SELECT ?t
WHERE {
?s rdf:type ?t
FILTER regex(?s, "var1")
}
如果能以正确的方式执行此操作,我将不胜感激。
主题不是字符串文字值,而是 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
}
另一个回答已经指出你的?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.