Алгебра 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 .
        ...
    }
}

person Blake Regalia    schedule 15.11.2015    source источник


Ответы (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 .
}
person AndyS    schedule 15.11.2015
comment
Прямо сейчас чувствую себя немного глупо из-за того, что забыл граф с правильным именем, когда выдергивал волосы, пытаясь понять, почему мой блок filter not exists не отфильтровывает :Bar. Спасибо, что нашли время, чтобы ответить, я надеюсь, что другие сочтут это полезным в будущем. - person Blake Regalia; 15.11.2015