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