Поддерживает ли SWRL оператор перечисления для отдельных лиц?

Я делаю некоторые правила SWRL в онтологии OWL следующим образом:

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

H350, H350i, H400 и H401 — некоторые названные лица. Как мы видим, шаблон этих правил SWRL аналогичен. Поэтому я думаю, что, возможно, мы можем заменить эти правила только одним правилом, которое звучит так:

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

Я попробовал этот синтаксис на вкладке «Правила» в Protege, но это не сработало. Поддерживает ли SWRL такой индивидуальный оператор перечисления?


person Edouard Xu    schedule 18.11.2016    source источник


Ответы (1)


Это возможно с выражением класса OWL типа "Range".

let myClass = class из thing, которые имеют some hasHazardCode в диапазоне [H350, H350i, ... ] in hasHazardCode(?a, ?HValue) /\ Class(myClass, ?HValue) -> Class(DangerousProduct,?a)

Используя синтаксис java-пеллет, вот как можно переписать ваш пример:

    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")))
    );
person Galigator    schedule 29.03.2017