2016-08-17 4 views
3

Ich habe eine Frage über Polymorphismus in RDF-Schema.Abfrage Polymorphismus in RDF-Datenbank mit SPARQL

Ich habe eine Klasse "Mobilephone":

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix schema: <http://schema.org/> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix my: <http://localhost/> . 

my:MobilePhone rdf:type rdfs:Class . 
my:MobilePhone rdfs:subClassOf schema:Product . 
my:MobilePhone rdfs:label "MobilePhone" . 

Dann ausgeführt ich zwei Abfragen:

PREFIX : <http://schema.org/> 
PREFIX my: <http://localhost/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?instance 
WHERE { 
    ?instance a my:MobilePhone . 
     } 

und

PREFIX : <http://schema.org/> 
PREFIX my: <http://localhost/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?instance 
WHERE { 
    ?instance a :Product . 
     } 

ich die zweite Abfrage erwartet, dass alle Produkte abzurufen. Sogar "MobilePhone" -Produkte. Aber das ist nicht passiert. Ich hatte zu verwenden:

PREFIX : <http://schema.org/> 
PREFIX my: <http://localhost/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?instance 
WHERE { 
    ?class rdfs:subClassOf* :Product . 
    ?instance rdf:type ?class . 
} 

Hat jemand wissen, ob es möglich ist, mein Schema zu aktualisieren, so dass die erste Abfrage für alle Produkte der Suche funktionieren würde?

Antwort

3

Es ist möglich, Ihre Daten (nicht Ihr Schema [oder Ontologie]) zu aktualisieren, um das gewünschte Ergebnis durch „forward chaining“ zu liefern - dh durch explizite einschließlich Aussagen, dass jede Einheit, die a my:MobilePhone auch ist a :Product .

Es ist auch möglich, "Rückwärtsverkettung" zu verwenden, um das gewünschte Ergebnis zu liefern; Die Einzelheiten dazu variieren mit Ihrem Triple/Quad-Shop und anderer Software. (My employer ‚s Lösung, Virtuoso, verwendet eine DEFINE input:inference Pragma activate an inference rule set for each query.)

Beide können als‚Inferenz‘oder‚Denken‘in Betracht gezogen werden, wenn gemeinsame Nutzung gilt in der Regel diese Begriffe nur auf die dynamische Aktion - die passiert mit jeder Abfrage in "Rückwärtsverkettung" und einmal vor Abfrage, typischerweise während der Datenladung, in "Vorwärtsverkettung".

+1

Eine etwas seltsame Art, Dinge zu formulieren. "Vorwärtsverkettung" und "Rückwärtskettung" sind beide Formen der Schlussfolgerung. –

+0

In gewissem Sinne sind Sie richtig. Ich denke normalerweise nicht daran, "statische Daten abzufragen", um "Inferenz zu verwenden", selbst wenn Inferenz verwendet wurde, um diese statischen Daten zu erzeugen. Nach meiner Erfahrung stimmt der allgemeine Gebrauch mit meinem Denken überein. Ihre Laufleistung kann abweichen ... Möglicherweise auch erwähnenswert, keine Option ist ein "Update [von @ Maydas] Schema". – TallTed

+2

Angesichts der hier beschriebenen großen Varianz scheint es die verlässlichste, systemübergreifende Kompatibilität zu sein, die 'rdfs: subClassOf *' SPARQL-Abfrage zu verwenden. – scotthenninger