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