фильтрация результатов sparql перед выполнением запроса произвольного пути - PullRequest
0 голосов
/ 11 сентября 2018

Чтобы объяснить мой вопрос, я приведу фруктовый пример:

Допустим, у нас есть тройной магазин 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?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете проверить, что в цепочке :friendsWith нет узлов типа :Orange между <apple/123> и ?appleOrPear.

SELECT distinct ?appleOrPear WHERE {
    <apple/123> :friendsWith* ?appleOrPear .
    filter not exists {
        <apple/123> :friendsWith* ?x .
        ?x :friendsWith* ?appleOrPear .
        ?x a :Orange .
    }
}
...