use*_*242 3 rdf owl sparql protege description-logic
我想查询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>)
}
Run Code Online (Sandbox Code Playgroud)
来自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>
Run Code Online (Sandbox Code Playgroud)
我想查询所有id(id/420383004,id/425288007,id/127489000和id/68540007)
来自owl:Class rdf:about ="http://snomed.info/id/323283001"请告诉我一些想法.谢谢
Jos*_*lor 13
首先,有关SPARQL查询的一些注意事项是有序的.第一视差值之间*和+在属性路径,和所述第二方面的使用filter和的values.然后我们可以看看如何从数据中查询不同类型的子类/超类关系.这里的诀窍是我们正在寻找的一些关系是我们通常使用OWL推理器的关系,但是我们试图使用SPARQL做一些OWL推理
+和*请注意,在您链接到的另一个问题中,属性路径使用*运算符,这意味着长度为零或更长的路径.长度为零或更长的路径非常重要,因为如果您的表单数据中没有明确的三元组
:MyClass owl:equivalentClass :MyClass
Run Code Online (Sandbox Code Playgroud)
你不会得到任何查询匹配
?myClass owl:equivalentClass+ :MyClass
Run Code Online (Sandbox Code Playgroud)
但是你会得到一个结果(:MyClass)
?myClass owl:equivalentClass* :MyClass
Run Code Online (Sandbox Code Playgroud)
实际上,即使owl:equivalentClass 是对称属性(即,a owl:equivalentClass b我们可以推断 b owl:equivalentClass a),三元组可能只存在于数据的一个方向,所以我们实际上需要
?myClass (owl:equivalentClass|^owl:equivalentClass)* :MyClass
Run Code Online (Sandbox Code Playgroud)
values而不是filter顺便说一句,请注意,在此查询中,我直接在模式中使用了IRI; filter你原来的代码中没有必要:
filter(?s=<http://snomed.info/id/323283001>)
Run Code Online (Sandbox Code Playgroud)
如果你确实想要将一个变量绑定到超类,那么就更容易使用它values,就像在
values ?superclass { <http://snomed.info/id/323283001> }
?subclass (rdfs:subClassOf|owl:equivalentClass)* ?superclass
Run Code Online (Sandbox Code Playgroud)
通常,类之间的关系(例如,子类和超类关系)是您使用OWL推理器为您确定的事物.但是,有些很简单,并且在OWL公理的RDF编码中存在,您可以使用SPARQL查询得出相同的结论.例如,如果要在基于rdfs:subClassOf和的层次结构中查找子类关系owl:equivalentClass,可以使用如下模式:
?subclass (rdfs:subClassOf|owl:equivalentClass|^owl:equivalentClass)* ?superclass
Run Code Online (Sandbox Code Playgroud)
现在,如下所述,您可能会遇到Protégé的SPARQL选项卡的一些问题,因此我建议您将|使用情况保留为二进制大小写,因此您实际上是在写这种情况:
?subclass (rdfs:subClassOf|(owl:equivalentClass|^owl:equivalentClass))* ?superclass
Run Code Online (Sandbox Code Playgroud)
现在,您实际查看的数据使用更复杂的类表达式.当你有一个表格的OWL公理时
A subClassOf (B and C)
Run Code Online (Sandbox Code Playgroud)
你实际上说的是有一个A类,并且有一个(通常是匿名的)类是一个交集类,它是B和C的交集.你没有公理
甲subClassOf乙
甲subClassOf Ç
虽然他们逻辑上遵循,但你可以使用它们.你所拥有的案例实际上也包含了一个存在主义的限制
甲subClassOf(B 和 C ^ 和(对一些 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>
Run Code Online (Sandbox Code Playgroud)
我已经写过一个答案来回答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 .
}
Run Code Online (Sandbox Code Playgroud)
--------------
| superclass |
==============
| :A |
| _:b0 |
| :B |
| :C |
| _:b1 |
--------------
Run Code Online (Sandbox Code Playgroud)
现在,空白节点有匿名交集类和匿名限制类.如果您不想在结果中包含它们,可以非常轻松地将它们过滤掉:
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))
}
Run Code Online (Sandbox Code Playgroud)
--------------
| superclass |
==============
| :A |
| :B |
| :C |
--------------
Run Code Online (Sandbox Code Playgroud)
^owl:equivalentClass|owl:equivalentClass如果要跟随等效类,也可以添加到该属性路径中.
正如我所说,上面的结果是使用Jena的命令行工具.你说你想在Protégé做这件事,这让事情变得更难,因为它似乎引入了一些问题.我展示的最后一个查询只产生了Protégé中的A和B. 由于某种原因,它不包括C:

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

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