SPARQL имеет две операции для отрицания: используйте тот, который вы найдете наиболее естественным. Когда я прочитал описание проблемы, он больше походил на первый ниже, но в этой проблемной ситуации они очень похожи. Они отличаются по своим эффектам, когда какая-либо часть шаблона ничего не соответствует или когда нет общих переменных.
NOT EXISTS
испытания на отсутствие рисунка (есть также EXISTS
). Это фильтр, применяемый к каждому решению первого шаблона. Это похоже на вложенный ASK
, где также переменные заменяются входящими в фильтр.
PREFIX : <http://example/>
SELECT * {
GRAPH :yesterday { ?s ?p ?o }
FILTER NOT EXISTS { GRAPH :today { ?s ?p ?o } }
}
MINUS
выполняет две модели (левая и правая стороны), а затем возвращает строки слева, где нет соответствия один где-нибудь справа. Это анти-соединение.
PREFIX : <http://example/>
SELECT * {
GRAPH :yesterday { ?s ?p ?o }
MINUS { GRAPH :today { ?s ?p ?o } }
}
Для обоих я получаю:
------------------------
| s | p | o |
========================
| :Foo | :likes | :Qux |
------------------------
Триг:
@prefix : <http://example/> .
:yesterday {
:Foo
:likes :Bar ;
:likes :Qux .
}
:today {
:Foo
:likes :Bar ;
:likes :Baz .
}
Чувство немного глупое прямо сейчас забывания право с именем графа, когда я потянув меня за волосы, пытаясь выяснить, почему мой фильтр не существует, блок не отфильтровывал ': Bar'. Спасибо, что нашли время, чтобы ответить в любом случае, я надеюсь, что другие найдут это полезным в будущем. –