检索用作类型的空白节点

时间:2017-07-25 13:21:54

标签: 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

我应该如何构建查询?

1 个答案:

答案 0 :(得分:4)

我不知道为什么你希望?ba :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 是空白的,而是它是具有正确属性的限制。从公理如下:

:仅构建{: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,但序列化并不总是那么漂亮,因此即使OWL可以序列化为RDF,SPARQL也不一定是查询OWL的最佳方式。这有点像通过搜索文件中的特定字节或位来搜索文档中的文本。 可能工作,但如果有人要更改字符编码,您可以使用相同的文本,但不同的字节或位,因此查询可能不再有效。< / p>