Em SPARQL, MINUS e FILTER NOT EXISTS podem produzir resultados diferentes mesmo quando recebem o mesmo padrão à direita. A diferença aparece quando esse padrão pode casar sem compartilhar variáveis com as soluções à esquerda.
PREFIX ex: <https://example.org/>
SELECT ?person WHERE {
?person a ex:Person .
MINUS { ?order a ex:Order . }
}
Monte um grafo com ex:Ana a ex:Person e ex:Compra a ex:Order. A consulta devolve Ana. O padrão à direita casa com a compra, mas suas soluções ligam ?order, enquanto a esquerda só liga ?person. MINUS preserva soluções quando os domínios das ligações são disjuntos.
Agora substitua a cláusula MINUS por FILTER NOT EXISTS { ?order a ex:Order . }. A consulta fica vazia. Para cada solução de pessoa, o filtro pergunta se existe algum casamento para o padrão. Como existe uma compra, a condição falha.
Faça a exclusão acompanhar a pessoa
Se a intenção é selecionar pessoas sem pedidos, use um padrão correlacionado, como FILTER NOT EXISTS { ?order ex:buyer ?person . }. Adicione um pedido de Ana e outro de uma pessoa que a consulta não seleciona. Esse par de casos diferencia a ausência de pedido da pessoa da ausência de qualquer pedido no grafo.