Можно ли указать диапазон для 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>