Запрос 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