rdf - 我可以为 rdf :List members? 指定范围吗

标签 rdf

如果我想说某物的标题应该是一个 rdfs:Literal,我会这样做:

example:title a owl:DatatypeProperty ;
    rdfs:range rdfs:Literal .

现在我想表达的是某物有一个有序的标题列表:

example:titles a rdf:List .

我如何指定列表的成员应该是什么?我需要继承 rdf:List 吗?

更新:如果可能,我想继续使用 rdf:List,根据 Joshua 的回答,我认为以下内容说明任何仅具有 rdfs:Literal 值的 rdf:List 都是一个示例:ListOfLiterals,然后我可以使用这是一个范围。

@prefix entity: <http://example.com/stuff/> .
@prefix example: <http://example.com/my/term/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

example:ListOfLiterals a owl:Class ;
    owl:equivalentClass [
        a owl:Class ;
        owl:intersectionOf (
            rdf:List
            [
                a owl:Restriction ;
                owl:allValuesFrom rdfs:Literal ;
                owl:onProperty rdf:first
            ]
            [
                a owl:Restriction ;
                owl:allValuesFrom example:ListOfLiterals ;
                owl:onProperty rdf:rest
            ] )
    ] .

example:Book a owl:Class .

example:titles a owl:DatatypeProperty ;
    rdfs:domain example:Book ;
    rdfs:range example:ListOfLiterals .

entity:somebook a example:Book ;
    example:titles ( "Book Title"@en "Second Book Title"@en ) .

这有意义吗,还是我误解了什么?

最佳答案

首先,请注意,在您的 OWL 代码中使用 rdf:List 意味着您将进入 OWL Full,而许多推理机是为与 OWL DL 一起工作而设计的。你可能对此没有意见,如果你是,那就太好了。如果您需要留在 OWL DL 中,那么您必须使用自己的词汇表来表示列表,例如类 warp:List 和属性 warp:firstwarp:rest,并使用它们代替对应的 RDF。

无论如何,一旦你决定了你的 List 类和你的 firstrest 属性,你可以定义一个列表类型ListOfElements 只能包含某些类 Element 的成员,但有以下限制:

ElementList ⊑ List and (first only Element) and (rest only ElementList)

这意味着 ElementList 是:(i) List; (ii) 具有作为 Elementfirst 属性的值; (iii) 有一个 ElementList 作为它的 rest,这意味着 List 中的其余部分也必须是 Element 无论 nil 对象是什么,都应该已经声明为 List,但您可能还想包括:

nil a ElementList

但这并不一定那么重要。对于您的情况,您希望以类似的方式定义一个类 TitleList,然后将您的属性范围声明为 TitleList

这是一个示例本体,其中仅包含定义这些类型的 List 类和 ElementList 类(在人类可读的 Turtle 中):

@prefix :      <http://stackoverflow.com/a/19480798/1281433/code#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:rest   a            owl:ObjectProperty ;
        rdfs:domain  :List ;
        rdfs:range   :List .

:List   a       owl:Class .

:nil    a       owl:NamedIndividual , :ElementList , :List .

:ElementList  a          owl:Class ;
        rdfs:subClassOf  [ a                   owl:Class ;
                           owl:intersectionOf  ( :List [ a                  owl:Restriction ;
                                                         owl:allValuesFrom  :Element ;
                                                         owl:onProperty     :first
                                                       ] [ a                  owl:Restriction ;
                                                           owl:allValuesFrom  :ElementList ;
                                                           owl:onProperty     :rest
                                                         ] )
                         ] .

:Element  a     owl:Class .

:first  a            owl:ObjectProperty ;
        rdfs:domain  :List .

<http://stackoverflow.com/a/19480798/1281433/code>
        a       owl:Ontology .

[ a                      owl:Axiom ;
  rdfs:comment           "It's probably a good idea to specify that nil is an ElementList.  This could also be inferred, though, if there is a nil-terminated List that is known to be an ElementList." ;
  owl:annotatedProperty  rdf:type ;
  owl:annotatedSource    :nil ;
  owl:annotatedTarget    :ElementList
] .

为了完全通用,我定义了一个新的 List 类、firstrest 属性,以及一个单独的 nil ,但是如果 OWL Full 适合你,那么你可以只使用 rdf:List 等。为了完整起见,这里是 RDF/XML 中的相同本体:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns="http://stackoverflow.com/a/19480798/1281433/code#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Ontology rdf:about="http://stackoverflow.com/a/19480798/1281433/code"/>
  <owl:Class rdf:about="http://stackoverflow.com/a/19480798/1281433/code#List"/>
  <owl:Class rdf:about="http://stackoverflow.com/a/19480798/1281433/code#ElementList">
    <rdfs:subClassOf>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="http://stackoverflow.com/a/19480798/1281433/code#List"/>
          <owl:Restriction>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="http://stackoverflow.com/a/19480798/1281433/code#first"/>
            </owl:onProperty>
            <owl:allValuesFrom>
              <owl:Class rdf:about="http://stackoverflow.com/a/19480798/1281433/code#Element"/>
            </owl:allValuesFrom>
          </owl:Restriction>
          <owl:Restriction>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="http://stackoverflow.com/a/19480798/1281433/code#rest"/>
            </owl:onProperty>
            <owl:allValuesFrom rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#ElementList"/>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:ObjectProperty rdf:about="http://stackoverflow.com/a/19480798/1281433/code#rest">
    <rdfs:range rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#List"/>
    <rdfs:domain rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#List"/>
  </owl:ObjectProperty>
  <owl:ObjectProperty rdf:about="http://stackoverflow.com/a/19480798/1281433/code#first">
    <rdfs:domain rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#List"/>
  </owl:ObjectProperty>
  <owl:Axiom>
    <rdfs:comment>It's probably a good idea to specify that nil is an ElementList.  This could also be inferred, though, if there is a nil-terminated List that is known to be an ElementList.</rdfs:comment>
    <owl:annotatedTarget rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#ElementList"/>
    <owl:annotatedSource>
      <owl:NamedIndividual rdf:about="http://stackoverflow.com/a/19480798/1281433/code#nil">
        <rdf:type rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#ElementList"/>
        <rdf:type rdf:resource="http://stackoverflow.com/a/19480798/1281433/code#List"/>
      </owl:NamedIndividual>
    </owl:annotatedSource>
    <owl:annotatedProperty rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#type"/>
  </owl:Axiom>
</rdf:RDF>

关于rdf - 我可以为 rdf :List members? 指定范围吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19474738/

相关文章:

java - SPARQL 类型转换?

visualization - 优秀的 RDF 可视化工具

rdf - 使用数值数据的表达式定义 Protege 类

rdf - 如何 rdf :Bag, rdf :Seq and rdf:Alt is different while using them?

RDFS - 声明属性

hyperlink - rdf :seeAlso and rdfs:seeAlso 之间的区别

python - 在 python 或 javascript 中将 RDF 转换为 SVG?

javascript - 如何调整此 javascript 文件以读取本地主机上的数据。解析RDF任务

java - RDF/XML 中的动态数组

python - 将字符串分解为主谓词和宾语的三元组(三个字段的元组)。