2015-05-29 5 views
5

Ich mag eine Eigenschaft, die ein rdf:Seq als einen rdfs:range ein Objekt erstellen:Wie definiere ich den Typ der Elemente in einem rdf: Seq?

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

ich nach einer Möglichkeit, die Art der Elemente in den rdf:Seq gespeichert zu definieren. Zum Beispiel möchte ich nicht so:

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 
    ]; 
    . 

Gibt es eine Möglichkeit zu definieren, dass die rdf:Seq Elemente nur von der Art der eg:typeOfElement sind, wenn ich eg:myProperty definieren?

(Ich kann Eule, wenn nötig.)

Antwort

3

Es gibt wahrscheinlich eine Reihe von Möglichkeiten, dies zu erreichen, abhängig von der jeweiligen Implementierung Vorlieben. Mein Rat ist, die spezielle Eigenschaft rdf:li anstelle des beliebigen rdf:_nnn zu verwenden, das einfacher zu erweitern ist. rdf:li entspricht rdf:_1, rdf:_2 in der Reihenfolge. So sind die folgenden Codebausteine ​​gleichwertig:

:mySeq a rdf:Seq; 
    rdf:_1 :foo; 
    rdf:_2 :bar . 

:mySeq a rdf:Seq; 
    rdf:li :foo; 
    rdf:li :bar . 

Beachten Sie, dass die Reihenfolge im zweiten Block signifikant ist.

Um das zu erreichen, was Sie fordern, Sie rdf:li mit einer neuen Eigenschaft erweitern können und seine Domain/Bereich verfeinern (obwohl diese für den menschlichen Leser nur dann wirklich sinnvoll ist, wie das Kind Eigenschaft, um die Semantik der Mutter erbt):

:myItem rdfs:subPropertyOf rdf:li; 
    rdfs:range :typeOfElement; 
    rdfs:domain :mySeq . 

:myItem erbt die Semantik von rdf:li, so was auch immer implementatin Logik Sie können daraus schließen, dass die Werte von :myItem in irgendeiner sinnvollen Ordnung sind. Als nächstes definieren die :mySeq Klasse über eine Eigenschaft Einschränkung:

:mySeq rdfs:subClassOf [ 
    a owl:Restriction; 
    owl:onProperty :myItem; 
    owl:allValuesFrom :typeOfElement;]. 

, die behauptet, dass :mySeq eine Klasse aller Dinge ist, wo die Eigenschaft :myItem explizit für Werte von :typeOfElement verwendet wird. Sie können jetzt Listen mit :mySeq erstellen.


Um einen Schritt weiter zu gehen, Sie :mySeq als Schnittpunkt der obigen Regel und rdf:Seq definieren kann:

:mySeq a owl:Class; 
    owl:equivalentClass 
    [ a owl:Class; 
     owl:intersectionOf 
      (rdf:Seq 
      [a owl:Restriction; 
      owl:onProperty :myItem; 
      owl:allValuesFrom :typeOfElement ]) ] . 

Beachten Sie die Verwendung owl:equivalentClass anstelle von rdfs:subClassOf. Wenn wir owl:equivalentClass als symmetrische und subsumiert Behandlung von rdfs:subClassOf, zB:

owl:equivalentClass a owl:SymmetricProperty . 
owl:equivalentClass rdfs:subPropertyOf rdfs:subClassOf . 

dann können wir Gleichwertigkeit haben, die in beide Richtungen geht. Daher sind alle Instanzen von rdf:Seq, deren Werte für :myItem:typeOfElement sind, ebenfalls Instanzen von :mySeq. In diesem Fall leiten Sie den Typ ab. Also über die Aussage:

:x a rdf:Seq; :myItem :foo, :bar . 

können Sie daraus schließen, dass :x a :mySeq.

+0

Es ist nur ein Teil der Antwort.Ich kann nicht sagen, welche der Eigenschaften, 'rdf: _n' oder': myItem', werde ich in ': mySeq' verwenden. Mein Hauptproblem ist es, ': mySeq' zu zwingen,': myItem' zu verwenden. Ich denke also, ich muss eine Unterklasse von 'rdf: Seq' definieren oder so ähnlich. –

+0

Ja, Sie haben Recht. Ich habe meine Antwort aktualisiert. Hoffe es bringt dich auf eine bessere Spur. Sehen Sie sich auch die [ordered list ontology] (http://smiy.sourceforge.net/olo/spec/orderedlistontology.html) an, mit der Sie leichter arbeiten können als mit den rdf-Containern. – chris

Verwandte Themen