【问题标题】:SPARQL select based on the content of the subjectSPARQL 根据主题内容进行选择
【发布时间】:2019-04-26 06:08:03
【问题描述】:

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

我希望能帮助您以正确的方式执行此操作。

【问题讨论】:

  • 资源是通过URI来标识的,而且你知道URI,那为什么还要使用REGEX呢?你有一个特定的用例吗?我的意思是,在极少数情况下您不知道完整的 URI,但只要您事先知道,最好按照下面的答案进行操作。此外,SPARQL 引擎效率更高,因为它可以使用一些数据库索引。
  • 只是为了您将来使用 RDF 和 SPARQL 工作。如果您以接近 SPARQL 查询语法的 Turtle 语法查看数据,这将有很大帮助
  • 太好了,谢谢 AKSW,我要去看看 Turtle!

标签: select sparql rdf


【解决方案1】:

主题不是字符串文字值,而是 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
}

【讨论】:

  • 感谢 Jeen,这很有帮助!
【解决方案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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 2019-10-21
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多