Sparql查询Subclass或EquivalentTo

时间:2014-01-13 13:14:38

标签: rdf sparql owl protege description-logic

我想查询Nicotine(产品)的所有子类。
结果必须是(鼻形尼古丁,来自ni的Oropharyngeal ..(4项)..见图) 我尝试通过rdfs查询:subClassOf +和owl:equivalentClass +但是没有用 试试this example 这里的代码相同。

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>)       
}

this image from 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”请告诉我一些想法。感谢

1 个答案:

答案 0 :(得分:12)

首先,关于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 ,并且有一个(通常是匿名的)类是一个交集类,它是 B的交集 C 。你没有公理

  

subClassOf B
   subClassOf C

虽然他们逻辑关注,但仍然可以使用

。你实际上的案例实际上还包括一个存在的限制,按照

的方式
  

subClassOf (B C (p 某些 D))

重要的是要注意A的超类是B,C和(p some D)。特别是,A是不是 p或D的子类。用一个具体的例子可能更容易看到:

  

TiredManWearingHat subClassOf (男子 TiredPerson (穿着一些帽子)

一个戴着帽子的疲倦的男人显然是一个男人,显然是一个疲惫的人,显然是戴着帽子的东西,但他肯定不是一个穿着(甚至没有意义),他是当然不是帽子。这是一个最小的本体,它具有我们可以使用的结构:

simple structure in 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>

我已经写了Retrieving superclasses implied by OWL intersection classes的答案,描述了如何编写关于交集类的查询,所以我不会再在这里解释所有这些,但是我将包含一个适用于它的查询这个案例。我展示的结果是我使用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:

enter image description here

但是,对空白节点的处理要好一些(即,我们可以删除filter并获得一些有用的输出):

enter image description here

不幸的是,我不确定如何获得Jena在Protégé中提供的相同输出,但我正在通过电子邮件发送他们的邮件列表。