簡體   English   中英

Sparql查詢Subclass或EquivalentTo

[英]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>)       
}

來自protege的這張圖片謝謝。

第一個查詢很難解釋和做,因為這么大的文件有些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查詢的一些注意事項是有序的。 第一個是關於屬性路徑中*+的區別,第二個是關於filtervalues 然后我們可以看看如何從數據中查詢不同類型的子類/超類關系。 這里的訣竅是我們正在尋找的一些關系是我們通常使用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通過SPARQL查詢推理

通常,類之間的關系(例如,子類和超類關系)是您使用OWL推理器為您確定的事物。 但是,有些很簡單,並且在OWL公理的RDF編碼中存在,您可以使用SPARQL查詢得出相同的結論。 例如,如果要在基於rdfs:subClassOfowl: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類,並且有一個(通常是匿名的)類是一個交集類,它是BC的交集。 你沒有公理

一個subClassOf B.
一個subClassOf C

雖然他們邏輯上遵循,但你可以使用它們。 你所擁有的案例實際上也包含了一個存在主義的限制

subClassOf (B C 以及 (p some D))

重要的是要注意A的超類在這里是B,C和(p some D)。 特別是,A 不是 p或D的子類。通過具體示例可能更容易看到:

TiredManWearingHat subClassOf( TiredPerson (戴帽子的一些

一個戴着帽子的疲倦的男人顯然是一個男人,顯然是一個疲憊的人,顯然是戴帽子的東西,但他肯定不是一個穿着(甚至沒有意義),他肯定不是一個帽子。 這是一個最小的本體,它具有我們可以使用的完全結構:

Protégé的簡單結構

<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到該屬性路徑中。

在Protégé這樣做

正如我所說,上面的結果是使用Jena的命令行工具。 你說你想在Protégé做這件事,這讓事情變得更難,因為它似乎引入了一些問題。 我展示的最后一個查詢只產生了Protégé中的A和B. 由於某種原因,它不包括C:

在此輸入圖像描述

但是,空白節點的處理要好一些(即,我們可以刪除filter並獲得一些有用的輸出):

在此輸入圖像描述

不幸的是,我不確定如何獲得Jena在Protégé中提供的相同輸出,但我正在通過電子郵件發送他們的郵件列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM