4 Stimmen

SPARQL Query, alles auswählen, außer Dinge, die passen?

Ich komme langsam mit dem Schreiben von normalen Abfragen in SPARQL zurecht, aber ich habe immer noch Probleme mit komplizierteren Dingen. Mein neuestes Problem ist der Versuch, alles auszuwählen, außer den Dingen, die der Where-Klausel entsprechen. Nehmen wir an, ich möchte alle Ehemänner finden, die eine Autofarbe mögen, die ihrer Frau nicht gefällt (ich arbeite an einem proprietären Modell, also entschuldigen Sie das Beispiel und vertrauen Sie einfach darauf, dass es im echten Modell Sinn macht).

Das hätte ich vielleicht:

<bob> <spouse> <alice>
<bob> <likes> <red>
<alice> <likes> <red>
<carl> <spouse> <dorothy>
<carl> <likes> <blue>
<dorothy> <likes> <yellow>
<eric> <spouse> <fannie>
<eric> <likes> <black>

Wie lautet die Abfrage, die Carl und Eric auswählt, aber nicht Bob? Bonuspunkte, wenn Sie blau und schwarz in derselben Abfrage auswählen können. Die Auswahl von bob wäre einfach:

select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . ?wife <likes> ?color}

Wonach ich suche, ist:

select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . NOT (?wife <likes> ?color)}

aber das ist natürlich falsch. Was ist also richtig?

4voto

PlexLuthor Punkte 568

Eine richtige Antwort, die ich in anderen Quellen gefunden habe, lautet in etwa so:

select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . OPTIONAL {?wife <likes> ?wifecolor FILTER (?wifecolor = ?color)} FILTER (!BOUND(?wifecolor))}

Es funktioniert zumindest bei Eric, aber ich habe Carl noch nicht getestet.

4voto

Antoine Zimmermann Punkte 5035

Es gibt einen einfacheren und natürlicheren Weg, dies in SPARQL 1.1 zu tun (aber es ist äquivalent zur OPTIONAL/BOUND-Lösung):

SELECT ?husband ?color 
WHERE {
    ?husband <spouse> ?wife .
    ?husband <likes> ?color .
    FILTER NOT EXISTS {?wife <likes> ?color}
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X