Выбор с использованием 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> . }
}
Другие вопросы по тегам