Xsd 在OWL中描述字符串文字的正确方法?

Xsd 在OWL中描述字符串文字的正确方法?,xsd,owl,Xsd,Owl,对于以下XSD: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:simpleType name="size"> <xs:restriction base="xs:string"> <x

对于以下XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:simpleType name="size">
  <xs:restriction base="xs:string">
    <xs:enumeration value="small" />
    <xs:enumeration value="medium" />
    <xs:enumeration value="large" />
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="jeans">
  <xs:simpleContent>
    <xs:extension base="size">
      <xs:attribute name="sex">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="male" />
            <xs:enumeration value="female" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

</xs:schema> 
但我不喜欢这样。文字看起来很像常量。owl:类可以有许多实例。有没有办法在OWL中表示常量?结果可能如下所示:

<Constant rdf:abot="#female" rdf:type="http://www.w3.org/2001/XMLSchema#string">female</Constant>
女性

这个问题可以重新表述:如何在OWL中描述普通字符串文字?

文字在OWL中是常量。核心问题是如何将XML模式转换为OWL,而转换并不总是简单的。在有枚举值的情况下,我建议创建一个类和枚举实例列表。因此,请尝试对模型进行以下编辑:

:GenderClass
    a       owl:Class ;
    rdfs:subClassOf
          [ a       owl:Restriction ;
            owl:maxCardinality "1"^^xsd:int ;
            owl:onProperty :gender
          ] ;
    owl:oneOf (:Class_2_male :Class_2_female) .
:Class_2_male
    a       :GenderClass ;
    rdfs:label "male"^^xsd:string .
:Class_2_female ;
    a       :GenderClass ;
    rdfs:label "female"^^xsd:string .
:gender
    a       owl:ObjectProperty ;
    rdfs:range :GenderClass .
然后可以使用:gender谓词创建实例:

:Person1
    a       :Person ;
    :gender :Class_2_female .
在猫头鹰中,一切都是常数。事物(个体)是常量虹膜,对象属性将它们与其他个体(更常量的虹膜)关联,数据类型属性将它们与字符串和数字等文本关联。当您想要进行此类限制时,可以创建任何一种枚举。如果希望保留现有XSD模式的意图,可能需要使用文本枚举

文字枚举 在OWL中,在指定数据类型属性的范围时,可以使用文本枚举。例如,在Protege中,您可以使用Manchester语法并指定hasSex属性的范围为{“男性”、“女性”}

本体的RDF映射的序列化如下所示:

@前缀:。
@前缀rdf:。
@前缀owl:。
@前缀xsd:。
@前缀rdfs:。
:hasSex a owl:DatatypeProperty;
rdfs:range[a rdfs:Datatype;
owl:rdf:List中的一个;
rdf:第一个“女性”;
rdf:rest[a rdf:List;
rdf:第一个“男性”;
rdf:rest()
]
]
] .
个人计数 当然,您可能还希望使用个人作为枚举常量。你也可以这样做。在这种情况下,您有一些选择。在一种情况下,您可能有一个类,它实际上是一组已定义的个体,在这种情况下,您可能需要如下内容:

在Turtle中,这看起来像:

@前缀:。
@前缀rdf:。
@前缀owl:。
@前缀xsd:。
@前缀rdfs:。
:中等a猫头鹰:姓名/个人,:大小。
:小猫头鹰:姓名:个人,:大小。
:大型猫头鹰:名称:个体,:大小。
:大小猫头鹰:类;
owl:equivalentClass[一个owl:Class;
猫头鹰:其中之一(:中:大:小)
] .
但是,如果只想指定属性的范围,则不必创建相应的枚举类。您可以执行与文字枚举相同的操作,只需声明属性的范围是枚举。例如,您可以说hasdimiteresize的范围是{Small,Medium},而事先没有将某个类定义为等同于{Small,Medium}

相关的 另见:

  • 这个问题的答案有一些额外的评论,关于你是想选择文字还是个人。如果你选择文字,那么你就不能对它们说任何其他的东西,而如果你选择个人,你可以
  • 这只是枚举文本的另一个示例
  • 一个示例,其中枚举的项必须是个人,而不是文字

但是,如果要保持与原始XSD的一致性,使用字符串枚举将更有意义,而且同样简单。例如,在曼彻斯特语法中,您可以将属性的范围声明为
{“male”,“female”}
。只要枚举上不需要元数据,字符串也可以工作。是的,这也是一个重要的问题。我提到过,例如,在“如果你想说关于响应类型的任何事情,它们必须是个体。例如,当响应类型是个体时,你可以给它们额外的类型,……如果你的响应类型是文本,你将无法做到这一点,因为文本不能成为语句的主题。”
:Person1
    a       :Person ;
    :gender :Class_2_female .