首先要做的是确保您的本体是为任务正确设计的。正如您正确指出的那样,您将需要具体化来实现这一目标。这意味着您需要引入一个类来表示您的 n 元关系,即:

具有规则的相关本体和一些要测试的个体将如下所示:
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
是表示n 元关系probability
组件的属性。AncestorProbability
另一个需要注意的重要事项是descendant(?a3, ?x)
必须添加以指示AncestorProbability
必须将规则应用于哪个个人的哪个后代。
一个可能的问题是您使用的推理器可能不支持swrlm:eval(?p3, "p1 * p2", ?p1, ?p2)
,这是我在使用 Protege 和 HermiT 推理器进行测试时发现的问题。一些商业推理者可能确实支持这一点。