SPARQL Query, выберите все, кроме совпадений? - PullRequest
3 голосов
/ 17 декабря 2008

Мне комфортно писать обычные запросы на 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)}

но очевидно, что это неправильно. Так что же правильно?

Ответы [ 2 ]

4 голосов
/ 17 декабря 2008

Один правильный ответ, который я нашел в других источниках, выглядит примерно так:

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

По крайней мере, это работает для Эрика, но я не проверял Карла.

3 голосов
/ 28 апреля 2012

Существует более простой и более естественный способ сделать это в SPARQL 1.1 (но это эквивалентно решению OPTIONAL / BOUND):

SELECT ?husband ?color 
WHERE {
    ?husband <spouse> ?wife .
    ?husband <likes> ?color .
    FILTER NOT EXISTS {?wife <likes> ?color}
}
...