Probabilmente ci sono un certo numero di modi per ottenere questo, a seconda delle vostre preferenze di implementazione. Il mio consiglio è di usare la proprietà speciale rdf:li
al posto dell'arbitrario rdf:_nnn
, che è più facile da estendere. rdf:li
è equivalente a rdf:_1
, rdf:_2
nell'ordine. Così i seguenti blocchi di codice sono equivalenti:
:mySeq a rdf:Seq;
rdf:_1 :foo;
rdf:_2 :bar .
:mySeq a rdf:Seq;
rdf:li :foo;
rdf:li :bar .
Nota che l'ordine nel secondo blocco è significativo.
per realizzare ciò che si sta chiedendo, è possibile estendere rdf:li
con una nuova proprietà e perfezionare suo dominio/gamma (anche se questi sono solo veramente significativo per i lettori umani, come la proprietà figlio eredita la semantica della controllante):
:myItem rdfs:subPropertyOf rdf:li;
rdfs:range :typeOfElement;
rdfs:domain :mySeq .
:myItem
eredita la semantica di rdf:li
, quindi qualunque logica implementatin avete può dedurre che i valori di :myItem
sono in qualche modo significativo. Successivo definire la classe :mySeq
attraverso una restrizione di proprietà:
:mySeq rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement;].
che afferma che :mySeq
è una classe di tutte le cose in cui la proprietà :myItem
è esplicitamente utilizzato per valori di :typeOfElement
. Ora puoi creare elenchi con :mySeq
.
Per fare un passo ulteriore, è possibile definire :mySeq
come l'intersezione della regola di cui sopra e rdf:Seq
:
:mySeq a owl:Class;
owl:equivalentClass
[ a owl:Class;
owl:intersectionOf
(rdf:Seq
[a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement ]) ] .
Si noti l'uso owl:equivalentClass
al posto di rdfs:subClassOf
. Se trattiamo owl:equivalentClass
come simmetrica e sussunta da rdfs:subClassOf
, ad esempio:
owl:equivalentClass a owl:SymmetricProperty .
owl:equivalentClass rdfs:subPropertyOf rdfs:subClassOf .
allora possiamo avere l'equivalenza che va in entrambe le direzioni. Pertanto, tutte le istanze di rdf:Seq
i cui valori per sono di :typeOfElement
sono anche istanze di :mySeq
. In questo caso stai inferendo il tipo. Così tramite la dichiarazione:
:x a rdf:Seq; :myItem :foo, :bar .
si può dedurre che :x a :mySeq
.
È solo una parte della risposta.Non posso dire quale proprietà, 'rdf: _n' o': myItem', userò in ': mySeq'. Il mio problema principale è forzare ': mySeq' a usare solo:: myItem'. Quindi penso che dovrò definire una sottoclasse di 'rdf: Seq' o qualcosa del genere. –
Sì, sei corretto. Ho aggiornato la mia risposta. Spero che ti metta su una pista migliore. Dai anche un'occhiata alla [ontologia dell'elenco ordinata] (http://smiy.sourceforge.net/olo/spec/orderedlistontology.html), che potrebbe essere più semplice da utilizzare rispetto ai contenitori in formato rdf. – chris