Можно ли указать диапазон для rdf: список участников?

Если я хочу сказать, что заголовок чего-то должен быть rdfs: Literal, я делаю это:

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

Теперь я хочу выразить, что у чего-то есть упорядоченный список названий:

example:titles a rdf:List .

Как мне указать, какими должны быть участники списка? Нужно ли подкласс rdf: список?

ОБНОВЛЕНИЕ: Я хотел бы продолжать использовать rdf: List, если это возможно, основываясь на ответе Джошуа. Я думаю, что следующее говорит, что любой rdf: Список только с rdfs: Литеральными значениями является примером: 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 ) .

Имеет ли это какой-то смысл или я что-то неправильно понял?

1 ответ

Решение

Во-первых, обратите внимание, что с помощью rdf:List s в вашем коде OWL означает, что вы будете в OWL Full, тогда как многие из аргументов предназначены для работы с OWL DL. Вы можете быть в порядке с этим, и если вы, то отлично. Если вам нужно остаться в OWL DL, вам придется использовать свой собственный словарь для списков, например, класс warp:List и свойства warp:first а также warp:rest и используйте их вместо своих аналогов RDF.

В любом случае, как только вы определились с List класс и твой first а также rest свойства, вы можете определить тип списка ListOfElements которые могут содержать только члены некоторого класса Element со следующим ограничением:

ElementList ⊑ List и (только первый элемент) и (оставшийся только ElementList)

Это означает, что ElementList это: (я) List; (ii) имеет значение для first свойство, которое является Element; и (iii) имеет ElementList как его rest Это означает, что остальные вещи в List также должен быть Element s. Безотносительно nil объект уже должен быть объявлен как List, но вы также можете включить:

ноль ElementList

но это не обязательно так важно. Для вашего случая вы хотите определить класс TitleList аналогичным образом, а затем объявить диапазон вашей собственности как TitleList,

Вот пример онтологии, которая включает в себя только определяет эти типы List класс и ElementList класс (в человечески читаемой черепахе):

@prefix :      <http://stackru.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://stackru.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 учебный класс, first а также rest свойства и индивидуальный 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://stackru.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://stackru.com/a/19480798/1281433/code"/>
  <owl:Class rdf:about="http://stackru.com/a/19480798/1281433/code#List"/>
  <owl:Class rdf:about="http://stackru.com/a/19480798/1281433/code#ElementList">
    <rdfs:subClassOf>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="http://stackru.com/a/19480798/1281433/code#List"/>
          <owl:Restriction>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="http://stackru.com/a/19480798/1281433/code#first"/>
            </owl:onProperty>
            <owl:allValuesFrom>
              <owl:Class rdf:about="http://stackru.com/a/19480798/1281433/code#Element"/>
            </owl:allValuesFrom>
          </owl:Restriction>
          <owl:Restriction>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="http://stackru.com/a/19480798/1281433/code#rest"/>
            </owl:onProperty>
            <owl:allValuesFrom rdf:resource="http://stackru.com/a/19480798/1281433/code#ElementList"/>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:ObjectProperty rdf:about="http://stackru.com/a/19480798/1281433/code#rest">
    <rdfs:range rdf:resource="http://stackru.com/a/19480798/1281433/code#List"/>
    <rdfs:domain rdf:resource="http://stackru.com/a/19480798/1281433/code#List"/>
  </owl:ObjectProperty>
  <owl:ObjectProperty rdf:about="http://stackru.com/a/19480798/1281433/code#first">
    <rdfs:domain rdf:resource="http://stackru.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://stackru.com/a/19480798/1281433/code#ElementList"/>
    <owl:annotatedSource>
      <owl:NamedIndividual rdf:about="http://stackru.com/a/19480798/1281433/code#nil">
        <rdf:type rdf:resource="http://stackru.com/a/19480798/1281433/code#ElementList"/>
        <rdf:type rdf:resource="http://stackru.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>
Другие вопросы по тегам