Подтвердить что ты не робот

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

Спасибо,

:)

4b9b3361

Ответ 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> . }
}