Выбор с использованием sparql на основе "тройной не существует"
Мне нужна небольшая помощь в выборе правильных троек из моего магазина....
<a> a <type/1> .
<b> a <type/1> .
<c> a <type/1> .
<c> a <type/2> .
Я хочу выбрать только элементы, которые являются type/1, а не type/2
Каков наилучший способ достичь этого с помощью запроса выбора sparql?
Я ищу что-то вроде:
select ?a where
{
?a a <type/1> .
!{ ?a a <type/2> }
}
Спасибо,
:)
Ответы
Ответ 1
Альтернативным решением SPARQL 1.1 является использование MINUS
, например.
SELECT ?a
WHERE
{
?a a <type/1> .
MINUS { ?a a <type/2> . }
}
MINUS
вычитает решения, которые соответствуют его тройному шаблону из существующих совпадений.
В большинстве случаев использование FILTER NOT EXISTS { }
и MINUS { }
эквивалентно, но будьте осторожны, есть некоторые угловые случаи, когда это неверно - см. спецификацию SPARQL 1.1 для некоторых примеры этого.
Ответ 2
В SPARQL 1.0 это немного сложно:
SELECT ?a WHERE {
?a a <type/1>.
OPTIONAL {
?a a ?othertype .
FILTER (?othertype = <type/2>)
}
FILTER (!BOUND(?othertype))
}
Предложение OPTIONAL
связывает ?othertype
для любого ?a
с <type/2>
и оставляет его несвязанным для любого ?a
, который его не имеет.
Окончательный FILTER
затем выбирает только те строки, где ?a
остался несвязанным.
В SPARQL 1.1 это намного проще:
SELECT ?a WHERE {
?a a <type/1>.
FILTER NOT EXISTS { ?a a <type/2> . }
}