SPARQL: обратный результат логического запроса

Я пытаюсь заставить SPARQL возвращать «ложь», если в базе данных RDF существует набор троек. Я могу вернуть «истину» с запросом ASK.

ASK WHERE { ?subjID rdf:type pref:Person. }

Как описано здесь, я попытался добавить NOT EXISTS { } внутри WHERE, но это приводит к ошибке.

ASK WHERE { NOT EXISTS { ?subjID rdf:type pref:Person. } }

person Neil Graham    schedule 16.04.2019    source источник


Ответы (1)


Документация, на которую я ссылаюсь, не описывает это, но вы должны поставить ФИЛЬТР перед НЕ СУЩЕСТВУЕТ.

ASK WHERE { FILTER NOT EXISTS { ?subjID rdf:type pref:Person. } }
person Neil Graham    schedule 16.04.2019
comment
документация, на которую вы ссылались, была старым черновиком. Правильные источники для изучения — это всегда официальные документы, т. е. в вашем случае рекомендация W3C для SPARQL. 1.1 - person UninformedUser; 17.04.2019
comment
Тем не менее, я не думаю, что ваше решение работает. Я имею в виду, он применяет фильтр к чему? Во время оценки фильтра exists сопоставление решений не выполняется. Вы можете проверить ASK WHERE { FILTER EXISTS { ?subjID rdf:type pref:AClassThatDoesNotExist. } } в качестве примера счетчика, он всегда возвращает true для произвольного класса, которого нет в наборе данных. Afaik, перед: ASK WHERE { ?subjID ?p ?o FILTER NOT EXISTS { ?subjID rdf:type pref:Person. } } должен быть общий тройной шаблон ?s ?p ?o - person UninformedUser; 17.04.2019
comment
@AKSW нет необходимости в искусственном шаблоне оператора перед фильтром - будет достаточно простого синглтона {} (на случай, если инструмент, анализирующий sparql, не вводит такой по умолчанию - person Damyan Ognyanov; 17.04.2019
comment
@DamyanOgnyanov хм, хорошо. на конечной точке DBpedia я пробовал ASK WHERE { {} FILTER EXISTS { ?s rdf:type dbo:NonExistingClass. } } против ASK WHERE { ?s ?p ?o FILTER EXISTS { ?s rdf:type dbo:NonExistingClass. } } - только второй возвращает false, что правильно. - person UninformedUser; 17.04.2019
comment
@DamyanOgnyanov, но в Викиданных это работает, как вы сказали, но в Викиданных это работает, как вы сказали, ASK WHERE { {} FILTER EXISTS { ?s wdt:P31 <http://www.wikidata.org/entity/NonExistingClass> } } возвращает false. Я так понимаю, что-то не так в Virtuoso? - person UninformedUser; 17.04.2019
comment
@ASKW запрос в ответе совершенно правильный. Предложение WHERE является действительным BGP (единственное решение пустого набора привязок) с FILTER, которое должно оцениваться по нему. Я предложил явное использование пустого BGP {} в качестве возможного обходного пути. Запрос из ответа корректно работает в службе Викиданных, так что, скорее всего, это ошибка службы dbpedia sparql. - person Damyan Ognyanov; 17.04.2019
comment
ASK WHERE { FILTER NOT EXISTS { ?subjID rdf:type pref:Person. } } — разумный запрос. NOT EXISTS соответствует заданному шаблону, который может содержать переменные. FILTER проверяет результаты пустого шаблона (одна строка, без переменных), и если он проходит фильтр, ASK истинно. Фильтр да ничего не соответствует ?subjID rdf:type pref:Person и нет, если есть какие-либо совпадающие тройки. - person AndyS; 17.04.2019
comment
@DamyanOgnyanov хорошо, тогда общедоступная конечная точка DBpedia, соответственно. его серверная часть Virtuoso неверна ... тем не менее, для меня этот синтаксис не совсем интуитивен: я имею в виду, что выполнение ФИЛЬТРА, такого как ASK WHERE { FILTER ( EXISTS { ?s a <Class>. }) }, практически ничего не выглядит немного странно. Спасибо за разъяснение. - person UninformedUser; 17.04.2019
comment
Совершенно правильно нужно воспринимать с недоверием, если оно не совместимо с крупным тройным магазином, таким как Virtuoso. Правильно по стандарту, да, но для решения важнее поддержка реальной инфраструктурой. - person alexis; 19.04.2019