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?

Était-ce utile?

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}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top