我正在制作一个描述编程语言的本体,但我有以下问题:一种语言可以有强类型或弱类型,我需要将我的模式限制为这两个选项......那么,我该怎么做呢?
这是我的架构示例:
:Language a rdfs:Class .
:typing a rdf:Propery ;
rdfs:domain :Language ;
rdfs:range ? .
提前致谢。
我不同意 Eduardo Silva 发布的答案。函数属性只能具有函数范围内的一个值。它可以多次使用,但是 OWL 推理器可以从这些三元组中做出一些蕴涵。例如,如果您有一些个人example:x1
和功能属性:p
,并且您在数据中看到:
example:x1 :p :foo .
example:x1 :p :bar .
那么您有权推断:foo
并且:bar
必须是同一个人,否则:p
将违反 的功能性质。或者,如果您通过其他方式知道:foo
并且:bar
是不同的个体,那么,鉴于上述两个额外的三元组,您的 OWL 模型是不一致的。
换句话说,test:typing
在某个资源上有两个值就可以了,只要您随后要求表示的两种类型方案实际上是相同的。这可能不是你想要的。此外,没有什么可以阻止包含原始范围描述中未提及的新值的三重存储。test:typing
例如:
:ruby a test:Language ;
test:typing test:duckTyping.
这与作为功能属性并不矛盾。test:typing
要将属性的范围限制为某个值的枚举之一,您真正想要的是一个 OWL枚举类。例如:
test:typing
a owl:ObjectProperty ;
rdfs:domain test:Language ;
rdfs:range [
owl:oneOf ( test:strongTyping test:weakTyping )
].
枚举类的扩展(允许值集)正是给定的个体集合。不允许其他人。
我认为一种解决方案可以是定义一个“功能属性”,该属性将“范围”限制为该类的一个成员(例如:Person hasGender Gender,其中性别可以是女性或男性 - 只有一个)。
这在 owl 中看起来像这样(在 Protege 中快速制作):
<owl:ObjectProperty rdf:about="&test;typing">
<rdf:type rdf:resource="&owl;FunctionalProperty"/>
<rdfs:domain rdf:resource="&test;Language"/>
<rdfs:range rdf:resource="&test;Type"/>
</owl:ObjectProperty>
(然后类型,将有子类:强和弱)。
希望这可以帮助。