2016-06-15 2 views
3

Предположим, что у меня есть следующие данные: RDFКак преобразовать запрос проверки модели в запрос SPARQL?

@prefix : <urn:ex:> 

:m :A "a" 
:m :A "b" 
:m :A "c" 
:m :B "a" 
:m :B "b" 

Что SPARQL запрос я мог бы использовать, чтобы проверить, удовлетворяет ли модель RDF следующую логическую формулу?

∀x A(X) → B(x) 
+0

Также см .: http://stackoverflow.com/questions/25256452/is-it-possible-to-express-a-recursive-definition-in-sparql. –

+1

Существует спецификация, которая точно описывает, как это сделать http://docs.stardog.com/icv/icv-specification.html – Michael

ответ

4

SPARQL не условными или универсальной количественной оценки, но есть экзистенциалам (ничего не делает соответствовать этому?), (Неявный) конъюнкция и отрицание (в «отсутствии» смысле).

Так переписать вопрос:

∀x A(x) → B(x) ⇒ 
∀x ¬ (A(x) ∧ ¬ B(x)) ⇒ 
¬ ∃x A(x) ∧ ¬ B(x) 

и что-то SPARQL может сделать, довольно много:

# Is there anything of type A but not B? 
ASK { 
    { ?x a :A } MINUS { ?x a :B } 
} 

Этот запрос возвращает истинный, если есть какие-либо нарушения ограничений.

+1

Это очень приятное использование [** минус **] (https: // www. w3.org/TR/sparql11-query/#neg-minus). Я обычно использую ** не существует ** по умолчанию (например, '? Xa: A. фильтр не существует {? Xa: B}', потому что ** минус ** может быть немного неожиданным время от времени (они не всегда дают одинаковые результаты), но это хороший пример правильного использования ** минус **. –

+1

Еще одно примечание к «Если это возвращает ложь, тест прошел». Это абсолютно правильно, но было бы проще подумать в выражении * положительной * формы выражения: «Запрос возвращает * true *, если есть какие-либо нарушения ограничения». –

+1

Текст украден :-) Да, минус чувствует себя лучше здесь, но, как и вы, я склонен фильтровать не существует. – user205512

Смежные вопросы