1

我正在制作一个描述编程语言的本体,但我有以下问题:一种语言可以有强类型或弱类型,我需要将我的模式限制为这两个选项......那么,我该怎么做呢?

这是我的架构示例:

:Language a rdfs:Class .

:typing a rdf:Propery ;
    rdfs:domain :Language ;
    rdfs:range ? .

提前致谢。

4

2 回答 2

4

我不同意 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 )
    ].

枚举类的扩展(允许值集)正是给定的个体集合。不允许其他人。

于 2012-11-11T23:42:46.063 回答
0

我认为一种解决方案可以是定义一个“功能属性”,该属性将“范围”限制为该类的一个成员(例如: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>

(然后类型,将有子类:强和弱)。

希望这可以帮助。

于 2012-11-11T15:34:41.113 回答