空白節點我有一個本體是這樣的:檢索用作類型
: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
。
我該如何構建我的查詢?
空白節點我有一個本體是這樣的:檢索用作類型
: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是空白的,而是它是正確屬性的限制。從像一個公理:
:一個建立只{: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的最佳方法。這就像在文檔中搜索文本中的文本一樣,方法是搜索文件中的特定字節或位。它可能可能工作,但如果有人要改變字符編碼,你可以有相同的文本,但不同的字節或位,所以查詢可能不再工作。
如果本體符合內存並且不需要CWA,或者使用類似SPARQL DL的東西。 – AKSW
您正在建議的查詢正在爲我工作。非常感謝!據我所知,對於SPARQL DL,我需要讓我的本體論得到推理,這是不可能的,因爲它太複雜而無法推理。所以我通過編碼以艱難的方式提取信息,這就是爲什麼我需要這個查詢。 – msc87