gpt4 book ai didi

rdf - Sparql查询子类或EquivalentTo

转载 作者:行者123 更新时间:2023-12-04 16:06:26 25 4
gpt4 key购买 nike

我想查询尼古丁(产品)的所有子类。
结果必须是(鼻形尼古丁,来自ni ..(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不是子类,也不是等效类,所以我改变了查询方式

<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


通过SPARQL查询进行OWL推理

通常,类之间的关系(例如,子类和超类关系)是您需要使用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的交集。您没有公理


B的子类
C的子类


提供给您,尽管它们在逻辑上遵循。实际上,您所遇到的情况还包括一个存在性限制,类似于


一个subClassOf(B和C和(p一些D))


重要的是要注意,这里A的超类是B,C和(p一些D)。特别地,A不是p或D的子类。这可以通过一个具体示例更容易看出:


TiredManWearingHat子类Of(男人和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>


我已经写了 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:



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



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

关于rdf - Sparql查询子类或EquivalentTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21092246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com