выбор с использованием sparql на основе «тройной не существует» - PullRequest
22 голосов
/ 17 августа 2011

Мне нужна небольшая помощь в выборе правильных троек в моем магазине ....

<a> a <type/1> .
<b> a <type/1> .
<c> a <type/1> .
<c> a <type/2> .

я хочу выбрать только элементы типа / 1, а не типа / 2

Каков наилучший способ добиться этого с помощью запроса sparql select?

ищу что-то вроде:

select ?a where 
{ 
    ?a a <type/1> .
    !{ ?a a <type/2> }
}

Спасибо

:)

Ответы [ 2 ]

26 голосов
/ 17 августа 2011

Альтернативным решением SPARQL 1.1 является использование MINUS например,

SELECT ?a
WHERE
{
  ?a a <type/1> .
  MINUS { ?a a <type/2> . }
}

MINUS вычитает решения, которые соответствуют его тройному шаблону из существующих совпадений.

В большинстве случаев использование FILTER NOT EXISTS { } и MINUS { } эквивалентны, но имейте в виду, что в некоторых случаях это не так - см. В спецификации SPARQL 1.1 некоторые примеры этого.

13 голосов
/ 17 августа 2011

В 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> . }
}
...