2008-12-17 10 views
3

Je me sens à l'aise pour écrire des requêtes régulières dans SPARQL, mais j'ai toujours des problèmes avec les choses plus géniales. Mon dernier problème est d'essayer de tout sélectionner sauf les trucs qui correspondent à la clause where. Par exemple, dis-je 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, alors excusez l'exemple et faites juste confiance que cela a du sens dans le vrai modèle).SPARQL Query, sélectionnez tout sauf les choses qui correspondent?

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? Points bonus si vous pouvez sélectionner bleu et 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} 

Ce que je suis à la recherche est:

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

, mais de toute évidence qui est faux. Alors qu'est-ce qui va bien?

Répondre

4

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))} 

au moins travaille pour eric, mais je n'ai pas tester carl.

+0

C'est la solution classique. – tialaramex

2

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} 
} 
Questions connexes