首先,XYZ 既不是subClassOf A、B、C 也不是subClassOf 它们的交集A and B and C(我使用的是manchester syntaax (see here))。
在您的 sn-p 中,您将 XYZ 定义为三个 anynomous (see here) 类的交集的 equivalentTo(这意味着也是 subClassOf);是(affects some A) and (hasMaker some B) and (hasPathologicalProcess some C)。这个交集不等同于A and B and C(曼彻斯特语法中的some代表someValuesFrom)。
要了解someValuesFrom 限制的含义,请参阅OWL 的documentation (see here):
值约束owl:someValuesFrom 是一个内置的 OWL 属性,
将限制类链接到类描述或数据范围。一种
包含owl:someValuesFrom 约束的限制描述了一个
拥有至少一种财产价值的所有个人的类别
有关是类描述的实例或数据值
数据范围。换句话说,它定义了一类个体 x
至少有一个y(类的一个实例)
数据范围的描述或值),使得 (x,y) 对是
P 的实例。这不排除还有其他情况
P 中的(x,y'),其中y' 不属于类描述或
数据范围。
EDIT2:
现在您应该已经理解了owl:someValuesFrom 的含义,正如@AKSW 所建议的,这里有一个简单的SPARQL 查询。但是,您不能仅使用rdfs:subClassOf 检索A、B 和C!您应该首先检索限制,然后访问属性和定义它的类,如下所示:
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 ?eqclass ?restriction ?onProp ?someValuesFrom where {
{?eqclass owl:equivalentClass/owl:intersectionOf _:b. _:b rdf:first ?restriction}
# First anonymous class (restriction) in the collection
UNION { ?eqclass owl:equivalentClass/owl:intersectionOf/(rdf:rest+/rdf:first+)* ?restriction.}
# getting other anonymous classes (restriction) using property paths and rdf:first and rdf:rest used in RDF collections.
?restriction rdf:type owl:Restriction.
# individuals of type owl:Restriction
?restriction owl:onProperty ?onProp.
# the property the restriciton is defined on which
?restriction owl:someValuesFrom ?someValuesFrom.
# the class of the owl:someValuesFrom property
}
EDIT2 结束
通过修改数据模型来解决其他问题。
首先,您的查询应该返回匿名类(affects some A) and (hasMaker some B) and (hasPathologicalProcess some C),这是您定义的交集。但是,由于它是一个匿名类,因此将为它返回一个空白节点B_node,而不是一个具体的类。要返回一个具体的类,你应该在你的本体中定义这个匿名交集作为这个交集的一个类;比如你可以创建类anyn_intersection,如下:
<owl:Class rdf:about="myPrefix#anyn_intersection">
<owl:equivalentClass>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Restriction>
<owl:onProperty rdf:resource="myPrefix#affects"/>
<owl:someValuesFrom rdf:resource="myPrefix#A"/>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="myPrefix#hasMaker"/>
<owl:someValuesFrom rdf:resource="myPrefix#B"/>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="myPrefix#hasPathologicalProcess"/>
<owl:someValuesFrom rdf:resource="myPrefix#C"/>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</owl:equivalentClass>
</owl:Class>
因此,您的查询将获得此类 anyn_intersection 而不是空白节点。
现在,如果您想在结果中获取所有 (affects some A)、(hasMaker some B) 和 (hasPathologicalProcess some C),您应该首先 确保推理器正在运行 因为这是一个隐含的知识,第二你应该为每个匿名交集类,以类似于上面anyn_intersection的方式定义一个具体的交集类。例如,您可以为匿名限制类定义anyn_AffectsSomeA:affects some A,如下所示:
<owl:Class rdf:about="myPrefix#anyn_AffectsSomeA">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="myPrefix#affects"/>
<owl:someValuesFrom rdf:resource="myPrefix#A"/>
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>
然后你必须定义两个相似的类anyn_hasMakerSomeB和anyn_hasPathologicalProcessSomeC。最后,将anyn_intersection 定义为anyn_AffectsSomeA、anyn_hasMakerSomeB 和anyn_hasPathologicalProcessSomeC 的交集。
EDIT1:
我不知道rdfLib 中是否有某些特定功能可以让您检索匿名类定义。这可能会解决您的问题,而无需按照我的建议进行定义。此外,您应该确保推理器正在运行。
EDIT1 结束: