2017-05-16 3 views
1

Ich habe drei Klassen, nennen wir sie :A, :B und :C und eine Eigenschaft :p.Wie erstellt man eine Klasse als Äquivalent einer Klasse mit definiertem Typ von RDF Statements?

Jede Aussage X: :p :Y sollte ein Mitglied der :A, wird, wenn :X a :B und :Y a :C

Derzeit ich eine Lösung mit OWL bevorzugen würde, könnte aber auch mit SPARQL und/oder SHACL sein.

+1

Die ganze Aussage ': X: p: Y' Shell wird ein Mitglied von': A' ?! Sprechen Sie über Verdinglichung? – AKSW

+0

Ja, also sollte die beste Lösung die Anweisungen generieren, aber ich wäre neugierig, auch eine Lösung für vorgenerierte Anweisungen zu lernen. –

+0

Aber das ist in OWL nicht möglich, oder? Ich bin kein Experte, aber ich habe nie davon gehört, ABox-Axiome für eine OWL-Klasse zu behaupten. Keines behauptete nicht über Schlussfolgerung. – AKSW

Antwort

0

überarbeitet ... könnte dies Ihre Anforderungen nicht erfüllen, weil es eine Folgerung über eine rdf machen ist: Statement, keine freistehende triple. Ich kann mir nicht vorstellen, wie ich das ohne eine Vergeltung machen kann. Vielleicht etwas mit benannten Graphen, obwohl das im Allgemeinen nicht mit OWL-Implementierungen kompatibel ist. Vielleicht möchten Sie Blazegraph's "Reification Done Right"

Auch vielleicht wissen Sie bereits, wie dies zu tun ist.

Es wird behauptet, dass LemonTest ein rdf: Statement ist. Mit Hermites Argumentation wird gefolgert, dass LemonTest ein FlavorStatement ist.

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

[ rdf:type owl:Ontology ; 
    owl:imports rdf: , 
       rdfs: 
] . 

:flavor rdf:type owl:ObjectProperty . 

:flavorStatement rdf:type owl:Class ; 
    owl:equivalentClass [ rdf:type owl:Restriction ; 
         owl:onProperty rdf:object ; 
         owl:someValuesFrom :flavor 
         ] , 
         [ rdf:type owl:Restriction ; 
         owl:onProperty rdf:subject ; 
         owl:someValuesFrom :fruit 
         ] ; 
    rdfs:subClassOf rdf:Statement . 


:fruit rdf:type owl:Class . 

:lemon a :fruit . 

:lemonTest rdf:type owl:NamedIndividual , 
    rdf:Statement ; 
    rdf:object :flavor ; 
    rdf:predicate :result ; 
    rdf:subject :lemon . 

:sour a :flavor . 

Erster Versuch: Ich bin kein Experte OWL auch nicht, aber der Einsiedler reasoner in Protégé beschwert sich nicht darüber nach:

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


:root a  owl:Class . 

:A  a    rdf:Statement ; 
     rdf:subject  :X ; 
     rdf:predicate :p ; 
     rdf:object  :Y ; 
     rdfs:subClassOf :root . 

:B  rdfs:subClassOf :root . 

:C  rdfs:subClassOf :root . 

:X  a  :B . 

:p  a  owl:ObjectProperty . 

:Y  a  :C . 
+0

In dieser Lösung ist ': A' ein Individuum, keine Klasse. Ich würde mir vorstellen, ': A' mit einer' eule: equivalentClass' zu definieren, wobei jede Anweisung N, die von den Knoten und Eigenschaften gemäß der Bedingung erstellt wird, nach dem Ausführen eines Reasoners ein Mitglied von ': A' wird. –

+0

: A ist in meinem Beispiel sowohl als Individuum als auch als Klasse definiert, aber das hilft nicht bei der Schlussfolgerung, die Sie vorschlagen –

+0

Ja, tatsächlich. Entschuldigung, ich habe das letzte Triple übersehen. –

1

Offensichtliche SPARQL Lösung für Tripel freistehende :

PREFIX : <http://example.com/ontology#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

CONSTRUCT { 
    [] a    :A, rdf:Statement ; 
     rdf:subject ?X ; 
     rdf:predicate :p ; 
     rdf:object ?Y 
} 
WHERE { 
    ?X a :B . 
    ?X :p ?Y . 
    ?Y a :C . 
} 

Mit Jena Regeln könnten Sie wahrscheinlich makeSkolem(...) verwenden.

1

Ihre Frage ist eher zweideutig und ziemlich unmöglich zu analysieren ohne intuitive Annahmen über das, was Sie ausdrücken möchten. Dies kann entweder aufgrund Ihrer Wahl sein, informell zu sein, um komplizierte Präzision zu vermeiden, oder aufgrund der Bedeutung der Konzepte von RDF und OWL.

Die Art, wie ich auf den ersten Satz interpretiert:

Jede Aussage X: :p :Y Mitglied :A

werden sollte war, dass:

Jede RDF Tripel der Form ?x :p ?y (wobei ?x und ?y ein beliebiges Subjekt bzw. Objekt sind) kann als abgeleitet werden Glut der Klasse :A.

Es ist leicht, die Frage in diesem Fall zu beantworten: Es ist nicht in einem der RDF ausgedrückt werden kann, RDFS, OWL, SWRL, RIF, SPARQL, SPIN, SHACL. Der Grund ist, dass es niemals möglich ist, irgendeine Klasse so zu beschränken, dass sie RDF-Tripel in irgendeinem dieser Formalismen und Sprachen enthält. Um dies zu tun, wäre es notwendig, RDF-Triples als erstklassige Bürger in der Sprache zu haben.

Die Verwirrung, wenn es ist, könnte sein, dass die Klasse rdf:Statement oft fälschlicherweise als die Klasse der RDF-Tripel betrachtet wird. rdf:Statement, obwohl beschrieben als eine Möglichkeit, Aussagen über Anweisungen auszudrücken, ist in keiner Weise auf RDF Tripel beschränkt, egal wie Sie Ihre Daten, Ontologie, Abfrage, Form, Regel usw. schreiben. Die Klasse rdf:Statement ist nur, formal eine willkürliche Klasse von Ressourcen.

Allerdings, unter Berücksichtigung der Kommentare und Antworten, kann es sehr gut möglich sein, dass meine Interpretation Ihrer Verwendung von "Aussage" und "Mitglied werden" für das ungeeignet ist, was Sie erreichen wollen.

Verwandte Themen