我们试图找到一个推理器(例如Protemi中的HermiT)来推断可以使用更具体的子属性来代替断言的一般属性。
类:
- Patient
- Finding
- Dyspnea
- ObservationStatus
- Inclusion
- Exclusion
属性:
- has_finding (domain: Patient, range: Finding)
- has_positive_finding (domain: Patient, range: Finding, Inclusion)
- has_negative_finding (domain: Patient, range: Finding, Exclusion)
如果我们断言以下三元组:
:Patient1 a :Patient .
:Patient1 :has_negative_finding :Dyspnea1 .
推理人可以推断(除其他事项外):
:Dyspnea1 a :Finding .
:Dyspnea1 a :Exclusion.
但是,当我们以相反的方式看待它并断言:
:Patient1 a :Patient .
:Dyspnea1 a :Dyspnea .
:Dyspnea1 a :Exclusion .
:Patient1 :has_finding :Dyspnea1.
我们希望推理者推断:
:Patient1 :has_negative_finding :Dyspnea1 .
我们似乎无法让Protege和HermiT得出这个结论并推断出三元组。
我们缺少什么?这些条件不是必要的,也不足以推断出这些知识吗?
答案 0 :(得分:2)
:Patient1 a :Patient . :Dyspnea1 a :Dyspnea . :Dyspnea1 a :Exclusion . :Patient1 :has_finding :Dyspnea1.
我们希望推理者推断:
:Patient1 :has_negative_finding :Dyspnea1 .
......我们缺少什么?这些条件是不必要和充分的 它能推断出那些知识吗?
这里有一些问题。
首先,您没有说过每个has_finding实际上都对应一个子属性。也就是说,仅仅因为某些东西有发现,你不知道它也有一个消极或积极的发现。这个发现可能只是一个普遍的发现,而不是一个更具体的发现。
其次,对象的更具体类型并不意味着您必须使用更具体的属性。
第三,即使您声明该发现是排除的,如果您不知道排除与包含不相符,您仍然可以将该发现同时作为正面和负面发现。
现在,真正好的做法是声明has_finding是has_negative_finding和has_positive_finding的并集,然后声明包含和排除不相交。然后,每个发现的实例都必须是一个或另一个,你可以做出推断。
既然你不能这样做,你需要某种替代方案。如果你使用个人作为每个人的诊断,那么你可以说每个发现都是一个消极的发现或一个正面的发现,如
(反向(hasFinding)某些患者)subClass((反向(hasNegativeFinding)某些患者)或(反向(hasPositiveFinding)某些患者))
同时使hasFinding反函数,以便每个发现与至多一个患者相关联。然后你会有这样的本体论:
@prefix : <http://stackoverflow.com/a/30903552/1281433/> .
@prefix a: <http://stackoverflow.com/a/30903552/1281433/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
a:Exclusion a owl:Class ;
rdfs:subClassOf a:Finding .
a:hasNegativeFinding a owl:ObjectProperty ;
rdfs:range a:Exclusion ;
rdfs:subPropertyOf a:hasFinding .
_:b0 a owl:Restriction ;
owl:onProperty a:hasPositiveFinding ;
owl:someValuesFrom a:Inclusion .
a: a owl:Ontology .
[ a owl:Restriction ;
rdfs:subClassOf [ a owl:Class ;
owl:unionOf ( _:b1 _:b0 )
] ;
owl:onProperty a:hasFinding ;
owl:someValuesFrom a:Finding
] .
a:Finding a owl:Class ;
owl:disjointUnionOf ( a:Finding a:Inclusion ) .
a:patient1 a owl:Thing , owl:NamedIndividual ;
a:hasFinding a:dyspnea1 .
_:b1 a owl:Restriction ;
owl:onProperty a:hasNegativeFinding ;
owl:someValuesFrom a:Exclusion .
a:hasFinding a owl:ObjectProperty .
a:Inclusion a owl:Class ;
rdfs:subClassOf a:Finding .
a:hasPositiveFinding a owl:ObjectProperty ;
rdfs:range a:Inclusion ;
rdfs:subPropertyOf a:hasFinding .
a:dyspnea1 a owl:NamedIndividual , a:Exclusion .
你可以得到这样的结果: