Verwenden von SPARQL für begrenzte RDFS- und OWL-Argumentation

Was mache ich derzeit mit rdflib zum Erstellen und Verwalten von RDF-Graphen in Python. RDFlib macht keine RDFS oder OWL Argumentation. Dies führt zu Ergebnissen wie die folgenden:

  1. Wenn ich habe

    A rdf:type MyType . MyType rdfs:subClassOf SuperType . 

    Und ich frage

     select ?x where {?x rdf:type SuperType} 

    Dann bekomme ich nichts, aber ich würde gerne A (von RDFS Semantik) bekommen.

  2. Dasselbe passiert mit owl:equivalentClass . Wenn ich habe

     A rdf:type MyType . MyType owl:equivalentClass SiblingType . 

    Und ich frage

     select ?x where {?x rdf:type SiblingType} 

    Ich würde gerne A bekommen, aber ich bekomme nichts.

Gibt es eine Möglichkeit, diese Ergebnisse zu bekommen?

2 Solutions collect form web for “Verwenden von SPARQL für begrenzte RDFS- und OWL-Argumentation”

Obwohl dies ein Bibliotheksanforderungsproblem ist und als solches das Thema für StackOverflow ausschließen möchte, möchte ich darauf hinweisen, dass Sie in vielen Fällen diese beiden Abfragen mit anspruchsvolleren SPARQL-Abfragen beantworten können. Für beide Fälle können Sie die folgende Abfrage verwenden, um die gewünschten Ergebnisse zu erhalten, wobei <class-of-interest> ist :SuperClass oder :SiblingClass :

 select ?x where { ?x rdf:type/(rdfs:subClassOf|owl:equivalentClass)* <class-of-interest> . } 

Dies findet ?x s, die einen Weg zum Starten mit rdf:type und gefolgt von null oder mehr von rdfs:subClassOf oder owl:equivalentClass und bekommt schließlich :SuperType .

Betrachten wir zum Beispiel die folgenden Daten in Turtle / N3. (Als beiseite, wenn Sie Fragen zum Ausführen von Abfragen gegen Daten stellen, geben Sie Daten, mit denen wir arbeiten können. Sie haben so etwas wie RDF-Daten in Ihrer Frage, aber nichts, was wir kopieren und einfügen und schreiben können eine Abfrage gegen .)

 @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix : <http://stackoverflow.com/q/20474862/1281433/> :i1 a :C . :C rdfs:subClassOf :D . :D rdfs:subClassOf :E . :i2 a :F . :F rdfs:subClassOf :G1 . :G1 owl:equivalentClass :G2 . :G2 rdfs:subClassOf :H . 

Sie können eine Abfrage wie die oben, um Einzelpersonen und ihre Arten zu wählen (beachten Sie, dass a Kurzschrift in SPARQL und Turtle / N3 für rdf:type ):

 prefix owl: <http://www.w3.org/2002/07/owl#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix : <http://stackoverflow.com/q/20474862/1281433/> select ?i ?type where { ?ia/(rdfs:subClassOf|owl:equivalentClass)* ?type } 
 -------------- | i | type | ============== | :i2 | :F | | :i2 | :G1 | | :i2 | :G2 | | :i2 | :H | | :i1 | :C | | :i1 | :D | | :i1 | :E | -------------- 

Bearbeiten : Diese Antwort wurde als Antwort auf die ursprüngliche, andere Frage veröffentlicht.

Ich sollte A bekommen, aber ich bekomme nichts!

Nein, das solltest du nicht RDF selbst enthält nichts über Ontologien, es ist nur ein dummer Graph, und das ist, was RDFLib tut.

Dahinter geht man über die Daten. Es ist eine zusätzliche Schicht. Bare RDFLib macht keine Argumentation, weil es komplex ist und im Allgemeinen sehr rechnerisch teuer ist. Es gibt Drittanbieter-Lösungen für das Argumentieren, aber bevor Sie sie beschäftigen, sollten Sie verstehen, was sie tun und welche Leistung sie haben werden.

Ein naiver Ansatz für RDFS und OWL 2 Argumentation über ein RDFLib-Diagramm ist Ivan Herman's OWL 2 RL-Implementierung . Es ist sehr einfach zu bedienen, aber du willst es bestimmt nicht, wenn du keine Spielzeug-Anwendung machst, denn es ist ein dummer Algorithmus, der sehr lange auf eine Grafik von realistischer Größe kommt.

FuXi ist eine leistungsfähigere Bibliothek, die den intelligenten Rete -UL-Algorithmus implementiert. Aber ich bin mir nicht sicher, ob es gepflegt ist oder ob es mit den aktuellen Versionen von RDFLib verwendbar ist.

Es gibt auch eine Fülle von Nicht-Python-basierten Lösungen für das Argumentieren, wie Pellet , aber die Integration mit RDFLib – oder jede andere RDF-Bibliothek – kann eine Aufgabe sein.

Sie sollten auch überlegen, welche Art von Schlussfolgerung Ihre Anwendung tatsächlich erfordert. Müssen Sie diese Unterklassen-Mitgliedschaft ableiten? Wenn du das machst, vielleicht ist es alles was du brauchst? – dann vielleicht könntest du es manuell durch iterieren über die X rdfs:subClassOf Y Triples mit RDFLib und Einfügen der neuen A rdf:type Y Triples.

Auf jeden Fall denken Sie daran, dass Semantic Web Argumentation ein komplexes Thema ist, das stark von der Anwendung abhängt.

  • Suche nach Namen in rdf / n3 Datei
  • Gleicher Sparql, der nicht die gleichen Ergebnisse zurückgibt
  • Python ist die beste Programmiersprache der Welt.