OWL 中 n 元关系的 SWRL 规则
SWRL rule on n-ary relation in OWL
我想用OWL(在Protege中)编码三元关系ancestorOf(x, y, p);说 y 是 x 的祖先,概率为 p。因为对象属性只支持二元关系,所以我的关系必须表示为一个关系 class 和一个关系个体,与 x、y 和 p 有关系(就像在 this 设计模式中一样)。
我真的不知道如何编写 SWRL 规则来推断传递关系。 IE。
ancestorOf(x, y, p1) ^ ancestorOf(y, z, p2) -> ancestorOf(x, z, p1 * p2)
如果有人能指出正确的方向,我将不胜感激。
提前致谢!
首先要做的是确保您的 ontology 是为任务正确设计的。正如您正确指出的那样,您需要具体化才能实现这一目标。这意味着您需要引入一个 class 来表示您的 n-ary 关系,即:
相关的 ontology 规则和一些个人测试如下:
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)
属性 并且您必须使用具体化,因此您必须指定规则 component-wise,其中 ancestor
、descendant
和 probability
是表示 AncestorProbability
n-ary 关系的组成部分的属性。
另一个需要注意的重要事项是必须添加 descendant(?a3, ?x)
以指示规则必须应用于哪个 AncestorProbability
个人的后代。
一个可能的问题是您使用的推理器可能不支持swrlm:eval(?p3, "p1 * p2", ?p1, ?p2)
,这是我在使用 Protege 和 HermiT 推理器测试时发现的问题。一些商业推理者可能确实支持这一点。
我想用OWL(在Protege中)编码三元关系ancestorOf(x, y, p);说 y 是 x 的祖先,概率为 p。因为对象属性只支持二元关系,所以我的关系必须表示为一个关系 class 和一个关系个体,与 x、y 和 p 有关系(就像在 this 设计模式中一样)。
我真的不知道如何编写 SWRL 规则来推断传递关系。 IE。
ancestorOf(x, y, p1) ^ ancestorOf(y, z, p2) -> ancestorOf(x, z, p1 * p2)
如果有人能指出正确的方向,我将不胜感激。
提前致谢!
首先要做的是确保您的 ontology 是为任务正确设计的。正如您正确指出的那样,您需要具体化才能实现这一目标。这意味着您需要引入一个 class 来表示您的 n-ary 关系,即:
相关的 ontology 规则和一些个人测试如下:
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)
属性 并且您必须使用具体化,因此您必须指定规则 component-wise,其中 ancestor
、descendant
和 probability
是表示 AncestorProbability
n-ary 关系的组成部分的属性。
另一个需要注意的重要事项是必须添加 descendant(?a3, ?x)
以指示规则必须应用于哪个 AncestorProbability
个人的后代。
一个可能的问题是您使用的推理器可能不支持swrlm:eval(?p3, "p1 * p2", ?p1, ?p2)
,这是我在使用 Protege 和 HermiT 推理器测试时发现的问题。一些商业推理者可能确实支持这一点。