使用值列表对OWL数据类型属性限制建模

时间:2013-09-13 11:43:31

标签: owl

我有一个叫做ResponseInformation的类,它有一个名为 hasResponseType 的数据类型属性,它必须只有以下字符串值:“Accept”,“Decline”和“Provisional”。

我理解我可以将其建模为一组名为ResponseType的类的个体,然后分别称为accept,decline和provisional,以及一个owl:oneOf公理,声明类ResponseType等同于“ “这一组实例。但是,我开始意识到OWL 2支持值列表作为数据类型属性的范围。例如,我可以将以下内容指定为Protege中 hasResponseType 属性的范围:{“接受”,“拒绝”,“临时”}

这似乎更容易两个选项,因为它不涉及创建额外的类,个人等。我想知道如果我采取第二种选择潜在的权衡,即是否有任何其他优势,或除了以外的其他优势方便吗?

2 个答案:

答案 0 :(得分:1)

第二种选择并不是特别简单或容易。在一个案例中,你需要一个额外的班级和3个人;在另一种情况下,您需要一个额外的数据类型和3个值。我没有看到本体开发的努力方面存在显着差异。在推理方面,它取决于实现,但我不确定reasoners通常更擅长处理枚举数据类型而不是枚举类。

此外,存在一个概念性问题,即“响应类型”是一系列字符。特别是,考虑到“拒绝”响应类型,法语中的“refuser”,我会发现很难说“refuser”是一个字符串,从首都“D”开始!对于个人,我可以为不同的语言指出不同的名称并提供它们的描述。此外,为什么必须将响应类型严格限制在这三种类型中?我宁愿将其建模如下:

:ResponseType  a  owl:Class .
:accept  a  :ResponseType;
    rdfs:label  "Accept"@en, "Accepter"@fr;
    rdfs:comment "This response type indicates that the request is accepted."@en,
                 "Ce type de réponse indique que la requête est acceptée."@fr .
:decline  a  :ResponseType .
    rdfs:label  "Decline"@en, "Refuser"@fr;
    rdfs:comment  "..."@en, "..."@fr .
:provisional  a  :ResponseType .
    rdfs:label  "Provisional"@en, "Provisoire"@fr;
    rdfs:comment  "..."@en, "..."@fr .
[]  a  owl:AllDifferent;
    owl:members  ( :accept :decline :provisional ) .
:hasResponseType  a  owl:ObjectProperty;
    rdfs:range  :ResponseType .

如果您真的希望Accept,Deny和Provisional成为唯一可能的响应类型,您可以添加:

:ResponseType  rdfs:subClassOf  [
    a  owl:Class;
    owl:oneOf  ( :accept :decline :provisional )
] .

如果你想更简洁,你也可以写:

:accept  a  owl:Thing .
:decline  a  owl:Thing .
:provisional  a  owl:Thing .
:hasResponseType  a  owl:ObjectProperty;
    rdfs:range  [
        a  owl:Class;
        owl:oneOf  ( :accept :decline :provisional )
    ] .

您正在寻找的替代方案可以表达如下:

:hasResponseType  a  owl:DatatypeProperty;
    rdfs:range  [
        a  rdfs:Datatype;
        owl:oneOf  ( "Accept" "Decline" "Provisional" )
    ] .

是的,Turtle序列化减少了3行,但这并不意味着使用高效的用户界面会更快。

答案 1 :(得分:0)

我认为Antoine Zimmermann's answer涵盖如何你可以做得相当好。我同意实施这两种方法所需的努力是相似的。我希望,虽然我没有对此进行测试,但是对于数据类型选项,某些类型的推理会更有效,因为我希望可以比单个版本更快地比较类型文字的平等和不等式。

但是,我认为我仍然建议采用枚举个体(以便 hasResponseType 是对象属性)方法,至少有两个原因:

  1. 正如Atoine的答案指出的那样,响应类型实际上是一个字符串有点可疑。相反,似乎响应类型将具有标签(或多个标签,例如,在不同语言中),这是一个字符串。
  2. (这是我的主要观点。)如果你想说任何关于的响应类型,他们需要是个人。例如,当响应类型是个体时,您可以为其提供其他类型,例如

    Accept a GuaranteedResponse
    Decline a not GuaranteedResponse
    Provisional a not GuaranteedResponse
    

    然后你可以询问,例如,给定的轮询器收集了多少not GuaranteedRepsonses。您还可以将代码与每种响应类型相关联,例如

    Accept hasCode "x789"
    Decline hasCode "x234"
    Provisional hasCode "x900"
    

    然后将其传递给回复:

    hasResponseCode subPropertyOf hasResponseType o hasCode
    

    如果你的ResponseTypes是文字,你将无法做到这一点,因为文字不能成为陈述的主语。