SPARQLクエリは、一致するもの以外のすべてを選択しますか?

StackOverflow https://stackoverflow.com/questions/375589

  •  22-08-2019
  •  | 
  •  

質問

私は、SPARQLで快適な書き込みを定期的にクエリを取得していますが、私はまだ手の込んだものとのトラブルを抱えています。私の最近の問題は、WHERE句に一致するものを除くすべてのものを選択しようとしています。例えば、私は彼らの妻は好きではない車の色が好き(私は、独自のモデルに取り組んでいるので、例を言い訳をし、ちょうどそれが本当のモデルに理にかなっていることを信頼して)すべての夫を見つけたいと言います。

私が持っているかもしれません。

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

カール・エリックを選択するクエリではなく、ボブは何ですか?ボーナスポイントは、あなたは、同じクエリで青と黒を選択することができます。ボブを選択すると、単純になります:

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

私は何を探していることはあります:

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

しかし、明らかにそれは間違っているのです。だから何だね?

役に立ちましたか?

解決

私は他の情報源で見つけた一つの正解はこのようなものです。

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

これは、少なくともエリックのために動作しますが、私はカールをテストしていない。

他のヒント

(それはオプション/拘束ソリューションと同等です)SPARQL 1.1でそれを行うには、より簡単で自然な方法があります:

SELECT ?husband ?color 
WHERE {
    ?husband <spouse> ?wife .
    ?husband <likes> ?color .
    FILTER NOT EXISTS {?wife <likes> ?color}
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top