2017-07-25 65 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