SPARQL Query, sélectionnez tout sauf les choses qui correspondent?
Question
Je reçois confortable écrire des requêtes régulières SPARQL, mais je suis toujours des problèmes avec des choses plus fantaisistes. Mon dernier problème est d'essayer de sélectionner tout sauf des choses qui correspond à la clause where. Par exemple, dire que je veux trouver tous les maris qui aiment une couleur de voiture que leur femme n'aime pas (je travaille sur un modèle propriétaire, donc excuser l'exemple et confiance juste qu'il est logique dans le modèle réel).
Je pourrais avoir:
<bob> <spouse> <alice>
<bob> <likes> <red>
<alice> <likes> <red>
<carl> <spouse> <dorothy>
<carl> <likes> <blue>
<dorothy> <likes> <yellow>
<eric> <spouse> <fannie>
<eric> <likes> <black>
Quelle est la requête qui sélectionne carl et eric, mais pas bob? Les points de bonus si vous pouvez sélectionner le bleu et le noir dans la même requête. Sélection bob serait simplement:
select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . ?wife <likes> ?color}
Qu'est-ce que je cherche est:
select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . NOT (?wife <likes> ?color)}
mais de toute évidence c'est faux. Alors ce qui est juste?
La solution
Une réponse que j'ai trouvé par d'autres sources est quelque chose comme ceci:
select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . OPTIONAL {?wife <likes> ?wifecolor FILTER (?wifecolor = ?color)} FILTER (!BOUND(?wifecolor))}
Il fonctionne au moins pour eric, mais je n'ai pas tester carl.
Autres conseils
Il est plus simple et plus naturellement de le faire en SPARQL 1.1 (mais il est équivalent à la solution EN OPTION / LIE):
SELECT ?husband ?color
WHERE {
?husband <spouse> ?wife .
?husband <likes> ?color .
FILTER NOT EXISTS {?wife <likes> ?color}
}