Frage

Ich bin immer bequem regelmäßige Abfragen in SPARQL zu schreiben, aber ich habe immer noch Probleme mit ausgefalleneren Sachen. Mein neuestes Problem versucht, alles außer Sachen auszuwählen, die die where-Klausel übereinstimmt. Zum Beispiel, sagen, dass ich alle Männer finden will, die ein Auto Farbe mögen, die ihre Frau nicht mag (ich bin auf einem proprietäres Modell arbeiten, so das Beispiel entschuldigen und nur darauf vertrauen, dass es sinnvoll, in der realen Modell macht).

Ich habe:

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

Was ist die Abfrage, die carl und eric, aber nicht Bob wählt? Bonuspunkte, wenn Sie in derselben Abfrage blau und schwarz wählen. wäre einfach bob Auswahl:

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

Was ich suche ist:

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

aber offensichtlich das ist falsch. Also, was ist richtig?

War es hilfreich?

Lösung

Eine richtige Antwort, die ich über andere Quellen gefunden ist so etwas wie folgt aus:

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

Es mindestens arbeitet für eric, aber ich habe nicht carl testen.

Andere Tipps

Es ist eine einfachere und natürlichere Art und Weise es in SPARQL 1.1 zu tun (aber es ist gleichbedeutend mit der OPTION / BOUND-Lösung):

SELECT ?husband ?color 
WHERE {
    ?husband <spouse> ?wife .
    ?husband <likes> ?color .
    FILTER NOT EXISTS {?wife <likes> ?color}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top