2013-06-27 13 views
5

die folgende Instanz von SomeClass Bedenken Sie:Stellen Sie sicher, dass mehrere Themen auf derselben Liste von leeren Knoten zeigen

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

Ich brauche jede Instanz (some_thing2, some_thing3, etc.) bei seine hasChainTo Eigenschaft Punkt haben die gleiche Liste von leeren Knoten (wie in dort ist nur eine Kopie davon). Ich muss die Liste der leeren Knoten Syntax pflegen, weil die Ketten sehr tief und diese Syntax ist sehr flüssig zum Schreiben jeder Kette (für SomeClass2, SomeClass3, etc.).

Wenn ich einfach eine Basisklasse und subClassOf daraus erstelle, erbt die hasChainTo -Eigenschaft, aber nicht das Objekt, auf das es zeigt. Das macht intuitiv Sinn, aber ich brauche das andere Verhalten.

Wie kann dies erreicht werden?

Antwort

5

Wenn Sie von mehreren Knoten im Diagramm auf dasselbe verweisen möchten, geben Sie einen URI an. Es muss nicht ein vollständig http: URI - Sie eine UUID verwenden:

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 (
    [ .. ] [ .. ] [ .. ] 
). 

Nicht verwechseln RDFS/OWL Unterklassen mit Vererbung von Zustand und Verhalten in der objektorientierten Sprachen. Die Klassenhierarchie in RDFS ist für , die Knoten klassifiziert - d. H. Sie einer Klasse zuordnet, wobei eine Klasse eine Gruppe von Ressourcen ist. Es gibt keine direkte Entsprechung der Code-Wiederverwendung, die Sie aus der Vererbung in Sprachen wie Java erhalten.

+2

Wenn OWL im Bild ist (was es ist wahrscheinlich nicht, da RDF-Listen verwendet werden), wenn es einen Weg gibt, um die Liste zu beziehen, obwohl, können Sie festlegen, dass 'Someclass subClassOf semapi: hasChainTo value ', was bedeutet, dass jede Instanz von' SomeClass 'tatsächlich 'semapi: hasChainTo ' (und "jede Instanz" enthält Instanzen von Unterklassen). –

+3

Ja, es ist wahr, dass Sie das tun könnten. Sie würden damit rechnen, die Komplexität eines OWL-Reasoners zu benötigen, anstatt jedes Mal, wenn eine Instanz erstellt wird, ein zusätzliches Tripel zu setzen. Da das Parlament die Update-Leistung bereits als problematisch eingestuft hat, bin ich mir nicht sicher, ob ich den Kompromiss zugunsten des Reasoners machen würde. Diese Entscheidung hängt jedoch vollständig von den Einzelheiten des Projektkontextes ab. –

2

Sie arbeiten wahrscheinlich in RDF (S) und nicht in OWL, aber wenn Sie die Möglichkeit haben, OWL-basierte Tools zu verwenden, und für alle, die diese Frage finden und OWL-basierte Tools verwenden können, Hier ist eine OWL-basierte Antwort.

Wenn Sie möchten, dass jede Instanz einer Klasse (einschließlich Instanzen ihrer Unterklassen) einen bestimmten Eigenschaftswert gemeinsam hat, können Sie eine Individual Value Restriction verwenden. In der Manchester-Syntax kann man sagen, dass Fälle von SomeClass alle den Wert sharedIndividual für die propery hasValue durch das Axiom haben:

SomeClass SubClassOf hasValue value sharedIndividual 

Dann hat jede Instanz SomeClass den Typen hasValue value sharedIndividual, was bedeutet, dass die Instanz hat sharedIndividual als ein Wert für die hasValue Eigenschaft.

Hier ist die N3-Serialisierung einer Ontologie mit einer Klasse SomeClass und zwei Unterklassen SomeSubClass und AnotherSubClass. Jede der drei Klassen hat eine deklarierte Person. Der Typ hasValue value sharedIndividual ist eine Oberklasse von 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 . 

Mit dieser Ontologie in Protégé geladen und mit Pellet für die Argumentation angebracht ist, zu fragen, welche Personen haben sharedValue als Wert der hasValue Eigenschaft zeigt alle Individuen.

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

+2

Vielen Dank für die Antwort. Für andere ist es hier erwähnenswert, dass dies in den OWL 2 Profilen EL und RL, aber nicht in QL über die 'ObjectHasValue'-Einschränkung unterstützt wird. http://www.w3.org/TR/owl2-profiles/ – parliament

+1

@parliament Sehr gute Beobachtung! Ich arbeite fast immer in OWL DL, also habe ich nicht alles über die verschiedenen Profile gelernt, aber das könnte sehr wichtig für jemanden sein, der in einem von ihnen bleiben muss! –