Prawdopodobnie istnieje wiele sposobów, aby to osiągnąć, w zależności od preferencji realizacji. Moja rada polega na użyciu specjalnej właściwości rdf:li
zamiast arbitralnego rdf:_nnn
, która jest łatwiejsza do przedłużenia. rdf:li
jest odpowiednikiem rdf:_1
, rdf:_2
w kolejności. Poniższe bloki kodu są równoważne:
:mySeq a rdf:Seq;
rdf:_1 :foo;
rdf:_2 :bar .
:mySeq a rdf:Seq;
rdf:li :foo;
rdf:li :bar .
Należy zauważyć, że kolejność w drugim bloku jest znacząca.
Aby to osiągnąć, o co prosicie, można wydłużyć rdf:li
z nowej nieruchomości i udoskonalić swoje domeny/zakres (choć to tylko naprawdę przemawia do czytelników człowieka, jako własność dziecko dziedziczy semantykę rodzica):
:myItem rdfs:subPropertyOf rdf:li;
rdfs:range :typeOfElement;
rdfs:domain :mySeq .
:myItem
dziedziczy semantykę rdf:li
, więc cokolwiek implementatin logika masz można wywnioskować, że wartości :myItem
są w jakiś sensowny kolejności. Następny określić klasę :mySeq
poprzez ograniczenie własności:
:mySeq rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement;].
który twierdzi, że :mySeq
to klasa wszystkich rzeczy, których właściwość :myItem
jest wyraźnie stosowane dla wartości :typeOfElement
. Możesz teraz tworzyć listy z :mySeq
.
Aby pójść o krok dalej, można określić :mySeq
jako punkt przecięcia powyższej reguły i rdf:Seq
:
:mySeq a owl:Class;
owl:equivalentClass
[ a owl:Class;
owl:intersectionOf
(rdf:Seq
[a owl:Restriction;
owl:onProperty :myItem;
owl:allValuesFrom :typeOfElement ]) ] .
Uwaga wykorzystanie owl:equivalentClass
zamiast rdfs:subClassOf
. Jeśli traktujemy owl:equivalentClass
jako symetryczne i podciągnięte przez rdfs:subClassOf
, np:
owl:equivalentClass a owl:SymmetricProperty .
owl:equivalentClass rdfs:subPropertyOf rdfs:subClassOf .
wtedy możemy mieć równoważności, który przechodzi w obu kierunkach. Dlatego wszystkie wystąpienia rdf:Seq
, których wartości dla :myItem
są z zakresu :typeOfElement
, są również instancjami :mySeq
. W tym przypadku wnioskujesz o typie. Tak więc przez oświadczenie:
:x a rdf:Seq; :myItem :foo, :bar .
możesz wywnioskować, że :x a :mySeq
.
To tylko część odpowiedzi.Nie mogę powiedzieć, która z właściwości, 'rdf: _n' lub': myItem', użyję w ': mySeq'. Moim głównym problemem jest zmuszenie ': mySeq' do używania tylko': myItem'. Myślę więc, że będę musiał zdefiniować pod-klasę 'rdf: Seq' lub coś podobnego. –
Tak, masz rację. Zaktualizowałem swoją odpowiedź. Mam nadzieję, że uda ci się znaleźć lepszy tor. Zapoznaj się także z [uporządkowaną listą ontologiczną] (http://smiy.sourceforge.net/olo/spec/orderedlistontology.html), która może być łatwiejsza do pracy niż z kontenerami rdf. – chris