2017-07-25 43 views
2

空白节点我有一个本体是这样的:检索用作类型

: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

我该如何构建我的查询?

回答

4

我不知道为什么你所期望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是空白的,而是它是正确属性的限制。从像一个公理:

        :一个建立只{: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的最佳方法。这就像在文档中搜索文本中的文本一样,方法是搜索文件中的特定字节或位。它可能可能工作,但如果有人要改变字符编码,你可以有相同的文本,但不同的字节或位,所以查询可能不再工作。

+0

如果本体符合内存并且不需要CWA,或者使用类似SPARQL DL的东西。 – AKSW

+0

您正在建议的查询正在为我工​​作。非常感谢!据我所知,对于SPARQL DL,我需要让我的本体论得到推理,这是不可能的,因为它太复杂而无法推理。所以我通过编码以艰难的方式提取信息,这就是为什么我需要这个查询。 – msc87