我想使用OWL(在Protege中)来编码三元关系ancestorOf(x,y,p);说y是概率为p的x的祖先。因为对象属性只支持二元关系,所以我的关系必须表示为一个Relation类和一个关系个体,关系到x,y和p(就像在this设计模式中一样)。
我真的不知道如何编写SWRL规则来推断传递关系。即
ancestorOf(x, y, p1) ^ ancestorOf(y, z, p2) -> ancestorOf(x, z, p1 * p2)
如果有人能指出我正确的方向,我会感激不尽。
提前致谢!
答案 0 :(得分:2)
要做的第一件事是确保您的本体是为这项任务正确设计的。正如你正确指出的那样,你需要具体化才能实现这一目标。这意味着你需要引入一个代表你的n-ary关系的类,即:
与规则相关的本体论和一些要测试的人将看起来如下:
ObjectProperty: ancestor
Domain: AncestorProbability
Range: Person
ObjectProperty: descendant
Domain: AncestorProbability
Range: Person
DataProperty: probability
Domain: AncestorProbability
Range: xsd:decimal
Class: AncestorProbability
Class: Person
Individual: _a1
Types:
AncestorProbability
Facts:
ancestor _y,
descendant _x,
probability 0.2
Individual: _a2
Types:
AncestorProbability
Facts:
ancestor _z,
descendant _y,
probability 0.31
Individual: _a3
Types:
AncestorProbability
Facts:
descendant _x
Individual: _x
Types: Person
Individual: _y
Types: Person
Individual: _z
Types: Person
DifferentIndividuals:
_a1,_a2,_a3
DifferentIndividuals:
_x,_y,_z
Rule:
ancestor(?a1, ?y), descendant(?a1, ?x), probability(?a1, ?p1),
ancestor(?a2, ?z), descendant(?a2, ?y), probability(?a2, ?p2),
descendant(?a3, ?x), swrlm:eval(?p3, "p1 * p2", ?p1, ?p2)
-> ancestor(?a3, ?z), probability(?a3, ?p3)
需要注意的一件重要事情是,由于没有ancestorOf(x, y, p)
属性,您必须使用具体化,因此您必须明确指定规则,ancestor
,descendant
和probability
是表示AncestorProbability
n-ary关系组件的属性。
需要注意的另一个重要事项是,必须添加descendant(?a3, ?x)
以指明哪个AncestorProbability
个人必须为哪个后代应用规则。
一个可能的问题是您使用的推理器可能不支持swrlm:eval(?p3, "p1 * p2", ?p1, ?p2)
,这是我在使用Protege和HermiT推理器进行测试时发现的问题。一些商业推理者可能支持这一点。