2016-06-15 9 views
3

Angenommen, ich habe folgende RDF-Daten:wie man Modellüberprüfungslogikabfrage zu SPARQL Abfrage umwandelt?

@prefix : <urn:ex:> 

:m :A "a" 
:m :A "b" 
:m :A "c" 
:m :B "a" 
:m :B "b" 

Was SPARQL Query konnte ich, ob das RDF-Modell die folgende logische Formel genügt, um zu überprüfen?

∀x A(X) → B(x) 
+0

Siehe auch: http://stackoverflow.com/questions/25256452/is-it-possible-to-express-a-recursive-definition-in-sparql. –

+1

Es gibt eine Spezifikation, die genau beschreibt, wie man das macht http://docs.stardog.com/icv/icv-specification.html – Michael

Antwort

4

SPARQL nicht conditionals oder universelle Quantifizierung, aber tut Existenziale haben (hat dies alles akzeptiert?), (Implizite) Verbindung und Negation (in Abwesenheit 'Sinn).

So schreiben die Frage:

∀x A(x) → B(x) ⇒ 
∀x ¬ (A(x) ∧ ¬ B(x)) ⇒ 
¬ ∃x A(x) ∧ ¬ B(x) 

und das ist etwas, SPARQL tun kann, ziemlich:

# Is there anything of type A but not B? 
ASK { 
    { ?x a :A } MINUS { ?x a :B } 
} 

Diese Abfrage liefert wahr, ob es irgendwelche Verletzungen der Beschränkung sind.

+1

Dies ist eine sehr nette Verwendung von [** minus **] (https: // www. w3.org/TR/sparql11-query/#neg-minus). Ich neige dazu, ** not exists ** standardmäßig zu verwenden (zB '? Xa: A. Filter existiert nicht {? Xa: B}', weil ** minus ** manchmal etwas überraschend sein kann (nicht immer die gleichen Ergebnisse), aber dies ist ein gutes Beispiel für die korrekte Verwendung von ** minus **. –

+1

Noch eine Anmerkung zu "Wenn das falsch zurückkommt, ist der Test bestanden." Das ist absolut richtig, aber es könnte einfacher sein zu denken in Bezug auf die * positive * Form der Aussage: "Die Abfrage gibt * true * zurück, wenn es Verstöße gegen die Constraint gibt." –

+1

Text gestohlen :-) Ja, minus fühlt sich hier besser an, aber wie du neige ich dazu, zu filtern existiert nicht. – user205512