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
] .
然后你想说 all :DarkColor
s:darker
比 all:MediumColor
和 all :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,因为定制程序可以更好/更有效地解决它。