IMO,使用您最喜欢的编程语言编写的自定义代码,您想做的事情似乎得到了更好的处理。用 OWL 很难表达这些东西,而且效率肯定不高。
但是 FWIW,这是您可以做的事情。系好安全带,开始高级 OWL 2 建模之旅。假设您有基本颜色“蓝色”、“绿色”、“红色”。您可以定义一个包含三个字符串的数据类型(我使用 Turtle 语法):
:baseColor a rdfs:Datatype;
owl:equivalentClass [
a rdfs:Datatype;
owl:withRestrictions ( [ xsd:pattern "blue|green|red" ] )
] .
然后你可以定义修改后的颜色:
:modColor a rdfs:Datatype;
owl:equivalentClass [
a rdfs:Datatype;
owl:withRestrictions (
[ xsd:pattern "(dark|light)?(blue|green|red)(ish)?" ]
)
] .
您甚至可以拥有更多数据类型,例如 :lightColor、:darkColor、mediumColor。
然后你创建一个类:Color,它有一个数据类型属性:hasColor:
:hasColor a owl:DatatypeProperty;
rdfs:domain :Color;
rdfs:range [
a rdfs:Dataype;
owl:unionOf ( :baseColor :modColor )
]
:Color a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :hasColor;
owl:someValuesFrom xsd:string
];
owl:hasKey ( :hasColor ) .
在这里,我强制:Color 的实例至少有一个颜色字符串,并且我强制颜色字符串是颜色的唯一标识符(它是一个键)。因此,每当我用它的颜色字符串给出颜色时,我都可以验证该字符串是否在上面给出的正则表达式模式中。假设我定义了数据类型:darkColor、:lightColor和:mediumColor,我也可以表达:darker和:lighter关系:
:DarkColor a owl:Class;
rdfs:subClassOf :Color, [
a owl:Restriction;
owl:onProperty :hasColor;
owl:allValuesFrom :darkColor
] .
:LightColor a owl:Class;
rdfs:subClassOf :Color, [
a owl:Restriction;
owl:onProperty :hasColor;
owl:allValuesFrom :lightColor
] .
:MediumColor a owl:Class;
rdfs:subClassOf :Color, [
a owl:Restriction;
owl:onProperty :hasColor;
owl:allValuesFrom :mediumColor
] .
那么你想说所有:DarkColors 都是:darker,而不是所有:MediumColor 和所有:LightColor。这样的公理并不容易实现,因为它需要引入辅助项。它在论文 All Elephants are Bigger than All Mice 中有解释,在 DL 术语中称为概念产品:
:p1 a owl:ObjectProperty . # auxiliary property (do not reuse elsewhere)
:p2 a owl:ObjectProperty . # idem
:x a owl:Thing . # auxiliary individual
:darker owl:propertyChainAxiom ( :p1 :p2 ) .
:DarkColor rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :p1;
owl:hasValue :x
] .
[ owl:unionOf ( :LightColor :MediumColor ) ] rdfs:SubClassOf [
a owl:Restriction;
owl:onProperty [ owl:inverseOf :p2 ];
owl:hasValue :x
] .
对:lighter 执行相同操作。
您不能真正自动引入修改后的颜色。您确实必须提供一个包含所有基色 + 修饰符的图案。但这可以很容易地以编程方式完成。在任何情况下,我给出的 OWL 代码都不应该被使用,IMO,因为定制程序可以更好/更有效地解决它。