[英]Sparql query Subclass or EquivalentTo
我想查詢Nicotine(產品)的所有子類。
結果必須是(鼻形式尼古丁,Orophangengeal來自ni ..(4項)..見圖)我嘗試通過rdfs查詢:subClassOf +和owl:equivalentClass +但是沒有工作試試這個例子這里的代碼相同。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE
{
?s owl:equivalentClass+ ?o . # and try ?s rdfs:subClassOf ?o
filter(?s=<http://snomed.info/id/323283001>)
}
第一個查詢很難解釋和做,因為這么大的文件有些IRI不是subClass而不是等價的類,我改變了從這里查詢的方式
<owl:Class rdf:about="http://snomed.info/id/323283001">
<rdfs:label xml:lang="en">Nicotine (product)</rdfs:label>
<rdfs:subClassOf>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<rdf:Description rdf:about="http://snomed.info/id/420383004"/>
<rdf:Description rdf:about="http://snomed.info/id/425288007"/>
<owl:Restriction>
<owl:onProperty rdf:resource="http://snomed.info/id/127489000"/>
<owl:someValuesFrom rdf:resource="http://snomed.info/id/68540007"/>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</rdfs:subClassOf>
</owl:Class>
我想查詢所有id(id / 420383004,id / 425288007,id / 127489000和id / 68540007)
來自owl:Class rdf:about =“http://snomed.info/id/323283001”請告訴我一些想法。 謝謝
首先,有關SPARQL查詢的一些注意事項是有序的。 第一個是關於屬性路徑中*
和+
的區別,第二個是關於filter
和values
。 然后我們可以看看如何從數據中查詢不同類型的子類/超類關系。 這里的訣竅是我們正在尋找的一些關系是我們通常使用OWL推理器的關系,但是我們試圖使用SPARQL做一些OWL推理
+
和*
請注意,在您鏈接到的另一個問題中,屬性路徑使用*
運算符,這意味着長度為零或更長的路徑。 長度為零或更長的路徑非常重要,因為如果您的表單數據中沒有明確的三元組
:MyClass owl:equivalentClass :MyClass
你不會得到任何查詢匹配
?myClass owl:equivalentClass+ :MyClass
但是你會得到一個結果( :MyClass
)
?myClass owl:equivalentClass* :MyClass
實際上,即使owl:equivalentClass
是一個對稱屬性(即,從a owl:equivalentClass b
我們可以推斷 b owl:equivalentClass a
),三元組可能只出現在數據的一個方向上,所以我們實際上需要
?myClass (owl:equivalentClass|^owl:equivalentClass)* :MyClass
values
而不是filter
順便說一句,請注意,在此查詢中,我直接在模式中使用了IRI; 沒有必要像在原始代碼中那樣進行filter
:
filter(?s=<http://snomed.info/id/323283001>)
如果您確實希望將變量綁定到超類,則使用values
更容易,例如
values ?superclass { <http://snomed.info/id/323283001> }
?subclass (rdfs:subClassOf|owl:equivalentClass)* ?superclass
通常,類之間的關系(例如,子類和超類關系)是您使用OWL推理器為您確定的事物。 但是,有些很簡單,並且在OWL公理的RDF編碼中存在,您可以使用SPARQL查詢得出相同的結論。 例如,如果要在基於rdfs:subClassOf
和owl:equivalentClass
的層次結構中查找子類關系,可以使用如下模式:
?subclass (rdfs:subClassOf|owl:equivalentClass|^owl:equivalentClass)* ?superclass
現在,如下所述,您可能會遇到Protégé的SPARQL選項卡的一些問題,因此我建議您保留|
用於二進制的情況,所以你實際上寫,在這種情況下:
?subclass (rdfs:subClassOf|(owl:equivalentClass|^owl:equivalentClass))* ?superclass
現在,您實際查看的數據使用更復雜的類表達式。 當你有一個表格的OWL公理時
A subClassOf (B and C)
你實際上說的是有一個A類,並且有一個(通常是匿名的)類是一個交集類,它是B和C的交集。 你沒有公理
一個subClassOf B.
一個subClassOf C
雖然他們邏輯上遵循,但你可以使用它們。 你所擁有的案例實際上也包含了一個存在主義的限制
subClassOf (B 和 C 以及 (p some D))
重要的是要注意A的超類在這里是B,C和(p some D)。 特別是,A 不是 p或D的子類。通過具體示例可能更容易看到:
TiredManWearingHat subClassOf(人與 TiredPerson 和 (戴帽子的一些 )
一個戴着帽子的疲倦的男人顯然是一個男人,顯然是一個疲憊的人,顯然是戴帽子的東西,但他肯定不是一個穿着(甚至沒有意義),他肯定不是一個帽子。 這是一個最小的本體,它具有我們可以使用的完全結構:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns="https://stackoverflow.com/q/21092246/1281433/data.owl#">
<owl:Ontology rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl"/>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#C"/>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#B"/>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#A">
<rdfs:subClassOf>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#B"/>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#C"/>
<owl:Restriction>
<owl:onProperty>
<owl:ObjectProperty rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#p"/>
</owl:onProperty>
<owl:someValuesFrom>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#D"/>
</owl:someValuesFrom>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</rdfs:subClassOf>
</owl:Class>
</rdf:RDF>
我已經寫過一個答案來回答OWL交集類所暗示的超類 ,它描述了如何編寫關於交集類的查詢,所以我不會再在這里解釋所有這些,但是我將包含一個適用於此的查詢案件。 我展示的結果是我使用Jena的命令行SPARQL查詢工具得到的結果。
prefix : <https://stackoverflow.com/q/21092246/1281433/data.owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?superclass where {
:A (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?superclass .
}
--------------
| superclass |
==============
| :A |
| _:b0 |
| :B |
| :C |
| _:b1 |
--------------
現在,空白節點有匿名交集類和匿名限制類。 如果您不想在結果中包含它們,可以非常輕松地將它們過濾掉:
prefix : <https://stackoverflow.com/q/21092246/1281433/data.owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?superclass where {
:A (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?superclass .
filter(!isBlank(?superclass))
}
--------------
| superclass |
==============
| :A |
| :B |
| :C |
--------------
如果要跟隨等效類,也可以將^owl:equivalentClass|owl:equivalentClass
到該屬性路徑中。
正如我所說,上面的結果是使用Jena的命令行工具。 你說你想在Protégé做這件事,這讓事情變得更難,因為它似乎引入了一些問題。 我展示的最后一個查詢只產生了Protégé中的A和B. 由於某種原因,它不包括C:
但是,空白節點的處理要好一些(即,我們可以刪除filter
並獲得一些有用的輸出):
不幸的是,我不確定如何獲得Jena在Protégé中提供的相同輸出,但我正在通過電子郵件發送他們的郵件列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.