1

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

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

这似乎是两个选项中更容易的一个,因为它不涉及创建额外的类、个人等。我想知道如果我采用第二个选项可能会进行权衡,即除了方便之外还有其他优势或劣势吗?

4

2 回答 2

1

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

此外,将“响应类型”称为字符序列存在概念上的问题。特别是考虑到“拒绝”响应类型,即法语中的“拒绝者”,我很难说“拒绝者”是一个以大写“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 .

如果您真的希望接受、拒绝和临时成为唯一可能的响应类型,您可以添加:

: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 行,但这并不意味着使用高效的用户界面会更快。

于 2013-09-13T12:35:21.237 回答
0

我认为Antoine Zimmermann 的回答涵盖您如何能够很好地做到这一点。我同意实施这两种方法所需的努力是相似的。尽管我没有对此进行测试,但我希望某些类型的推理在数据类型选项上会更有效,因为我希望类型化的文字可以比个人更快地比较相等和不等式。

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

  1. 正如 Atoine 的回答所指出的,响应类型实际上是一个字符串有点令人怀疑。相反,响应类型似乎有一个字符串标签(或多个标签,例如,不同语言的标签)。
  2. (这是我的主要观点。)如果你想说什么关于响应类型,他们需要是个人。例如,当响应类型是个人时,您可以给他们额外的类型,例如,

    Accept a GuaranteedResponse
    Decline a not GuaranteedResponse
    Provisional a not GuaranteedResponse
    

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

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

    然后将其传递给响应:

    hasResponseCode subPropertyOf hasResponseType o hasCode
    

    如果您的 ResponseTypes 是文字,您将无法执行此操作,因为文字不能成为语句的主题。

于 2013-09-13T13:01:32.703 回答