3

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

しかし、明らかにそれは間違っています。それで、何が正しいのですか?

4

2 に答える 2

4

他の情報源から見つけた 1 つの正解は次のようなものです。

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

少なくとも eric では機能しますが、carl はテストしていません。

于 2008-12-17T19:44:54.413 に答える
3

SPARQL 1.1 には、よりシンプルで自然な方法があります (ただし、OPTIONAL/BOUND ソリューションと同等です)。

SELECT ?husband ?color 
WHERE {
    ?husband <spouse> ?wife .
    ?husband <likes> ?color .
    FILTER NOT EXISTS {?wife <likes> ?color}
}
于 2012-04-28T08:05:42.787 に答える