2013-06-27 9 views
5

Si consideri il seguente esempio di SomeClass:Assicurarsi che i soggetti multipli puntare alla stessa lista di nodi vuoti

instances:some_thing1 
       a semapi:SomeClass ; 
       semapi:hasChainTo (
         [ ... ] [ ... ] [ ... ] 
       ) . 

ho bisogno ogni esempio (some_thing2, some_thing3, ecc) per avere il suo punto di hasChainTo struttura al lo stesso elenco di nodi vuoti (come in c'è solo una copia di esso). Devo mantenere l'elenco della sintassi dei nodi vuoti perché le catene diventano molto profonde e questa sintassi è molto fluida per scrivere ogni catena (per SomeClass2, SomeClass3, ecc.).

Se faccio semplicemente una classe base e una subClassOf da essa, la proprietà hasChainTo eredita ma non l'oggetto a cui punta. Questo ha senso intuitivo, ma ho bisogno dell'altro comportamento.

Come può essere realizzato?

risposta

5

Se si desidera fare riferimento alla stessa cosa da più nodi nel grafico, è necessario fornire un URI. Non deve essere una piena http: URI - si potrebbe usare un'UUID:

instances:some_thing_1 
    semapi:hasChainTo <urn:uuid:12345>. 
instances:some_thing_2 
    semapi:hasChainTo <urn:uuid:12345>. 
instances:some_thing_3 
    semapi:hasChainTo <urn:uuid:12345>. 

<urn:uuid:12345> 
    semapi:chain (
    [ .. ] [ .. ] [ .. ] 
). 

Non confondere RDFS/OWL sottoclassi con l'ereditarietà di stato e il comportamento in linguaggi orientati agli oggetti. La gerarchia di classi in RDFS è per classificare i nodi, ad esempio assegnandoli a una classe, in cui una classe è un insieme di risorse. Non esiste un equivalente diretto del riutilizzo del codice che si ottiene dall'ereditarietà in linguaggi come Java.

+2

Se OWL è nella foto (che probabilmente non lo è, in quanto vengono utilizzati gli elenchi RDF), una volta che c'è un modo per fare riferimento alla lista, però, si potrebbe specificare che 'SomeClass subClassOf semapi: hasChainTo value ', il che significa che ogni istanza di' SomeClass' fa infatti 'semapi: hasChainTo ' (e "ogni istanza" include istanze di sottoclassi). –

+3

Sì, è vero che potevi farlo. Scambieresti con la complessità di un ragionatore OWL rispetto alla necessità di asserire un triplo in più ogni volta che viene creata un'istanza. Dal momento che il parlamento ha già segnalato le prestazioni di aggiornamento come una preoccupazione, non sono sicuro che farei il compromesso a favore del ragionatore. Ma questa decisione dipende interamente dai dettagli completi del contesto del progetto. –

2

Probabilmente stai lavorando in RDF (S), e non in OWL, ma se hai la possibilità di utilizzare strumenti basati su OWL, e per il gusto di chiunque trovi questa domanda e possa usare strumenti basati su OWL, ecco una risposta basata su OWL.

Se si desidera che ogni istanza di una classe (incluse le istanze delle sue sottoclassi) abbia un valore di proprietà in comune, è possibile utilizzare uno Individual Value Restriction. Nella sintassi di Manchester, si può dire che le istanze di SomeClass tutti hanno il valore sharedIndividual per la propery hasValue dall'assioma:

SomeClass SubClassOf hasValue value sharedIndividual 

Poi ogni istanza SomeClass ha il tipo hasValue value sharedIndividual, il che significa che l'istanza ha sharedIndividual come un valore per la proprietà hasValue.

Ecco la serializzazione N3 di un'ontologia con una classe SomeClass e due sottoclassi SomeSubClass e AnotherSubClass. Ciascuna delle tre classi ha un individuo dichiarato. Il tipo hasValue value sharedIndividual è una superclasse di SomeClass.

@prefix :  <http://www.example.com/valueClassExample#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix owl:  <http://www.w3.org/2002/07/owl#> . 
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> . 
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 

<http://www.example.com/valueClassExample> 
     a  owl:Ontology . 

:hasValue 
     a  owl:ObjectProperty . 

:sharedValue 
     a  owl:Thing , owl:NamedIndividual . 

:SomeClass 
     a  owl:Class ; 
     rdfs:subClassOf 
       [ a  owl:Restriction ; 
       owl:hasValue :sharedValue ; 
       owl:onProperty :hasValue 
       ] . 

:SomeSubClass 
     a  owl:Class ; 
     rdfs:subClassOf :SomeClass . 

:AnotherSubClass 
     a  owl:Class ; 
     rdfs:subClassOf :SomeClass . 

:SomeClassInstance 
     a  :SomeClass , owl:NamedIndividual . 

:SomeSubClassInstance 
     a  owl:NamedIndividual , :SomeSubClass . 

:AnotherSubClassInstance 
     a  owl:NamedIndividual , :AnotherSubClass . 

Con questa ontologia caricata in Protégé e con pellet fissati per il ragionamento, chiedendo che individui hanno sharedValue come valore della proprietà hasValue mostra tutti gli individui.

result of <code>hasValue value sharedProperty</code> DL query

+2

Grazie per la risposta. Vale la pena notare qui per altri che questo è supportato nei profili OWL 2 EL e RL ma non QL tramite la restrizione 'ObjectHasValue'. http://www.w3.org/TR/owl2-profiles/ – parliament

+1

@parliament Molto buona osservazione! Lavoro quasi sempre in OWL DL, quindi non ho imparato tutti i dettagli dei vari profili, ma questo potrebbe essere molto importante per qualcuno che ha bisogno di stare in uno di essi! –

Problemi correlati