2015-05-29 40 views
5

Voglio creare una proprietà che definisce un rdf:Seq come rdfs:range di un oggetto:Come definire il tipo di elementi in un rdf: Seq?

eg:myProperty a rdf:Property; 
    rdfs:range rdf:Seq; 
    . 

Sto cercando un modo per definire il tipo di elementi memorizzati nel rdf:Seq. Per esempio, io non voglio che questo:

eg:typeOfElement a rdf:Class; 
    . 

eg:somethingElse a rdf:Class; 
    . 

[] eg:myProperty [ 
     a rdf:Seq; 
     rdf:_1 [a eg:typeOfElement]; # It's the type I want 
     rdf:_2 [a eg:typeOfElement]; # It's the type I want 
     rdf:_3 [a eg:somethingElse]; # I don't want this type 
    ]; 
    . 

C'è un modo per definire che gli rdf:Seq elementi sono solo del tipo di eg:typeOfElement quando mi definisco eg:myProperty?

(posso usare gufo, se necessario.)

risposta

3

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.

+0

È 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. –

+0

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