sparql - 检索用作类型的空白节点

标签 sparql rdf owl ontology blank-nodes

我有一个本体,例如:

:indi_1 a :Segment; a [ :builds only {:indi_2}]; :hasID 1.

现在我想找到 indi_1 构建的个体。 我做了以下查询:

SELECT distinct ?a
WHERE {:indi_1 a ?b. ?b a _:blankNode}

但我仍然在结果中看到该段。另外,我无法到达空白节点内部来检索 indi_2

我应该如何构建我的查询?

最佳答案

我不知道为什么你会期望 ?b a :blankNode 要求 ?b 是一个空白节点。 :blankNode 是一个空白节点,在这样的 SPARQL 查询中充当变量,因此只需要 ?b> 有某种类型。您所写的查询甚至不合法。看起来您想要 :indi_1 a ?b 。 ?b a _:blankNode 代替(注意 .,而不是 ;)。

无论如何,要检查某些节点是否为空白节点,请查看 SPARQL 1.1 spec ,并注意有一个 isBlank 功能。这就是您用来过滤结果的方法。你会得到这样的东西:

select * {
  ?a a ?b 
  filter isBlank(?b)
}

但是,如果您实际要查找的是个人列表,则实际上需要更仔细地查看数据的 RDF 序列化。您实际上并不关心 ?b 是否为空,而是关心它是具有正确属性的限制。来自这样的公理:

    :a 仅构建 {:b, :c}

你最终会得到这样的 RDF:

:a      a       owl:NamedIndividual , owl:Thing ;
        a       [ a                  owl:Restriction ;
                  owl:allValuesFrom  [ a          owl:Class ;
                                       owl:oneOf  ( :c :b )
                                     ] ;
                  owl:onProperty     :builds
                ] .

所以你的查询是:

prefix :      <http://www.example.org/>
prefix owl:   <http://www.w3.org/2002/07/owl#>
prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#>

select ?x ?y {
  ?x a [ owl:allValuesFrom [ owl:oneOf/rdf:rest*/rdf:first ?y ] ] .
}
-----------
| x  | y  |
===========
| :a | :c |
| :a | :b |
-----------

您可以使用更多属性路径来清理它:

select ?x ?y {
  ?x rdf:type/owl:allValuesFrom/owl:oneOf/rdf:rest*/rdf:first ?y .
}

OWL 与 RDF 不同。 SPARQL 是一种 RDF 查询语言。 OWL 可以序列化为 RDF,但序列化并不总是那么漂亮,因此 SPARQL 不一定是查询 OWL 的最佳方式,即使 OWL 可以序列化为 RDF。这有点像通过搜索文件中的特定字节或位来搜索文档中的文本。它可能有效,但如果有人更改字符编码,您可能会拥有相同的文本,但字节或位不同,因此查询可能不再有效。

关于sparql - 检索用作类型的空白节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45304654/

相关文章:

rdf - 如何将 OWL 导入与相对路径一起使用?

python - 三元组组合的递归 SPARQL 查询

sparql - 如何使用 geonames ID 丰富地点

sparql - 如何查询 OWL 模式以获取实例之间的路径

sparql - 如何从SPARQL联合查询(服务关键字)返回特定变量?

sparql - 如何列出 Virtuoso 中的所有图表?

java - 将 jena 模型转换为 jena tdb

java - 使用类型化类和 rdf 创建 RDF 模型 :id

java - 导入具有相同IRI的本体

dataset - 在哪里可以找到易于以编程方式读取/使用的人体解剖学数据集