我正在尝试构建一个本体来推断一些关于领域分类和术语的信息,但我遇到了一些概念上的困难。
让我来解释一下这个问题。在Protègè4.1中,我创建了Thing的6个子类:Concept、conceptTitle、Concept同义词(用于分类)和Term、TermTitle、TermSynym(用于术语)。我还创建了hasConceptTitle、hasConceptSynym、hasTermTitle和hasTermSynym对象关系(带有一些约束),以表示每个概念都有一个(且只有一个)标题,并且可能有一些同义词,每个术语都有一(且仅有一)标题和一些同义词。Concept和Term都有另一种关系isA,为分类提供了DAG/树结构,而术语具有晶格结构(换句话说,一个术语可能是多个术语的子类)。
问题来了:我想创建Concept的一个子类,比如"MappedConcept"),它应该是一组映射的概念,也就是说,一组标题等于术语标题的概念,或者它有一个同义词等于术语标题,或者它的同义词等于一个术语的同义词。在一阶逻辑中,这个集合可以表示为:
∀x∃y( ∃z((hasConceptTitle(x,z) ∧ hasTermTitle(y,z)) ∨
∃z((hasConceptTitle(x,z) ∧ hasTermSynonym(y,z)) ∨
∃z((hasConceptSynonym(x,z) ∧ hasTermTitle(y,z)) ∨
∃z((hasConceptSynonym(x,z) ∧ hasTermSynonym(y,z)) )
我怎样才能得到这个?定义"概念标题"、"概念同义词"、"术语标题"one_answers"术语同义词"的数据属性?如何描述字符串匹配?也许这4个类应该只是Concept和Term类的数据属性?我读了好几遍Matthew Horridge的实用指南,但我无法将我脑海中的实用想法转化为Protègè的一本专著。
提前谢谢。
恐怕您既不能在OWL 2 DL中也不能在Protégé中做到这一点,Protégé是OWL 2 DL的编辑器,因为据我所知,似乎有必要引入数据类型属性的逆,而这在OWL 2中是被禁止的。然而,在OWL Full中这是可能的,一些DL推理者甚至可以处理它
<MappedConcept> a owl:Class;
owl:equivalentTo [
a owl:Class;
owl:unionOf (
[
a owl:Restriction;
owl:onProperty <hasConceptTitle>;
owl:someValuesFrom [
a owl:Restriction;
owl:onProperty [ owl:inverseOf <hasTermTitle> ];
owl:someValuesFrom <Term>
]
] [
a owl:Restriction;
owl:onProperty <hasConceptTitle>;
owl:someValuesFrom [
a owl:Restriction;
owl:onProperty [ owl:inverseOf <hasTermSynonym> ];
owl:someValuesFrom <Term>
]
] [
a owl:Restriction;
owl:onProperty <hasConceptSynonym>;
owl:someValuesFrom [
a owl:Restriction;
owl:onProperty [ owl:inverseOf <hasTermSynonym> ];
owl:someValuesFrom <Term>
]
] [
a owl:Restriction;
owl:onProperty <hasConceptSynonym>;
owl:someValuesFrom [
a owl:Restriction;
owl:onProperty [ owl:inverseOf <hasTermTitle> ];
owl:someValuesFrom <Term>
]
]
)
] .
您也可以在没有OWL的情况下执行此操作,例如使用规则语言。这些规则看起来更接近于编程语言中的操作方式。在SWRL中:
hasConceptTitle(?x,?z), hasTermTitle(?y,?z) -> MappedConcept(?x)
hasConceptTitle(?x,?z), hasTermSynonym(?y,?z) -> MappedConcept(?x)
hasConceptSynonym(?x,?z), hasTermTitle(?y,?z) -> MappedConcept(?x)
hasConceptSynonym(?x,?z), hasTermSynonym(?y,?z) -> MappedConcept(?x)