Алгебра SPARQL: хитрый вопрос из именованных графов, если не существует троек
Возьмите эти два названных графика:
# graph :yesterday
:Foo
:likes :Bar ;
:likes :Qux .
# graph :today
:Foo
:likes :Bar ;
:likes :Baz .
Теперь скажите, что вы хотите узнать, есть ли тройка на графике :yesterday
отсутствуют на графике :today
, Как бы ты ASK
этот запрос?
ASK
FROM NAMED :yesterday
FROM NAMED :today
{
GRAPH :yesterday {
?s ?p ?o .
...
}
}
1 ответ
В 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 |
------------------------
TRIG:
@prefix : <http://example/> .
:yesterday {
:Foo
:likes :Bar ;
:likes :Qux .
}
:today {
:Foo
:likes :Bar ;
:likes :Baz .
}