Чтобы объяснить мой вопрос, я приведу фруктовый пример:
Допустим, у нас есть тройной магазин RDF, заполненный 3 классами:
:Apple
:Orange
:Pear
И у нас есть 1 свойство:
:friendsWith
Яблоки, апельсины и груши могут дружить с другими яблоками, апельсинами и грушами.
Запрос, который я хочу реализовать:
«Учитывая яблоко / 123, дай мне все яблоки и груши, с которыми яблоко / 123 дружит не только в апельсинах».
Моя текущая версия этого запроса SPARQL выглядит так:
SELECT DISTINCT ?appleOrPear WHERE {
<apple/123> :friendsWith* ?appleOrPear .
FILTER NOT EXISTS {?appleOrPear a :Orange.}
}
Этот запрос действительно дает мне только яблоки и груши, которые связаны с apple / 123. Однако это также дало бы мне яблоки и груши, которые связаны через апельсины, чего я не хочу.
Итак, мне нужен способ фильтрации результатов до того, как будет выполнена часть запроса произвольного пути. Другими словами, я хочу игнорировать целый класс: orange для всего запроса.
Есть ли способ сделать это в SPARQL?