0

我在 OWL 本体中做一些 SWRL 规则,如下所示:

..., hasHazardCode(?a, H350) -> DangerousProduct(?a)
..., hasHazardCode(?a, H350i) -> DangerousProduct(?a)
..., hasHazardCode(?a, H400) -> DangerousProduct(?a)
..., hasHazardCode(?a, H401) -> DangerousProduct(?a)
......

H350, H350i,H400H401是一些有名字的个体。正如我们所见,这些 SWRL 规则的模式是相似的。所以我认为也许我们可以只用一条规则替换这些规则,如下所示:

..., hasHazardCode(?a, {H350, H350i, H400, H401}) -> DangerousProduct(?a)

我在 Protege 的“规则”选项卡中尝试了这种语法,但没有奏效。SWRL 是否支持这样的单个枚举语句?

4

1 回答 1

0

这可以通过类型为“Range”的 OWL 类表达式来实现。

let myClass =class范围thingsome hasHazardCode的_[H350, H350i, ... ] in hasHazardCode(?a, ?HValue) /\ Class(myClass, ?HValue) -> Class(DangerousProduct,?a)

使用pellet java syntax,这里可以重写您的示例:

    OWLObjectProperty myProperty = OWL.ObjectProperty("hasHazardCode");
    OWLObjectOneOf myRange = OWL.oneOf(OWL.Individual("H350"), OWL.Individual("H350i"), OWL.Individual("H400"), OWL.Individual("H401"));
    OWLClassExpression myClass = OWL.some(OWL.ObjectProperty("hasHazardCode"), myRange);

    SWRL.rule(
        SWRL.antecedent(
           SWRL.propertyAtom(myProperty, SWRL.variable("?a"), SWRL.variable("?HValue")),
           SWRL.classAtom(myClass, SWRL.variable("?HValue"))
        ),
        SWRL.consequent(SWRL.classAtom(OWL.Class("DangerousProduct"), SWRL.variable("?a")))
    );
于 2017-03-29T14:22:11.923 回答