Алгебра 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 .
}
Другие вопросы по тегам