2015-05-29 16 views
5

Chcę utworzyć właściwość wyznaczającą rdf:Seq jako rdfs:range obiektu:Jak zdefiniować typ elementów w rdf: Seq?

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

Szukam sposobu, aby określić typ elementów przechowywanych w rdf:Seq. Na przykład, nie chcę w ten sposób:

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

Czy istnieje sposób określić, że rdf:Seq elementy są tylko od rodzaju eg:typeOfElement kiedy zdefiniować eg:myProperty?

(mogę w razie potrzeby użyć sowa.)

Odpowiedz

3

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.

+0

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

+0

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

Powiązane problemy