我在OWL本体中做了一些SWRL规则,如下所示:
..., 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的Rules选项卡中尝试了这种语法,但它不起作用。SWRL是否支持像这样的单个枚举语句?
发布于 2017-03-29 22:22:12
这可以通过类型为"Range“的OWL类表达式来实现。
let myClass =
the class
of thing
some
hasHazardCode
in range [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")))
);
https://stackoverflow.com/questions/40684282
复制相似问题