我很乐意在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>
选择carl和eric的查询是什么,但不是bob?如果您可以在同一查询中选择蓝色和黑色,则可获得奖励积分。选择鲍勃只是:
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)}
但显然这是错的。那是对的?
答案 0 :(得分:4)
我通过其他来源找到的一个正确答案是这样的:
select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . OPTIONAL {?wife <likes> ?wifecolor FILTER (?wifecolor = ?color)} FILTER (!BOUND(?wifecolor))}
它至少适用于埃里克,但我还没有测试卡尔。
答案 1 :(得分:3)
在SPARQL 1.1中有一种更简单,更自然的方法(但它相当于OPTIONAL / BOUND解决方案):
SELECT ?husband ?color
WHERE {
?husband <spouse> ?wife .
?husband <likes> ?color .
FILTER NOT EXISTS {?wife <likes> ?color}
}