Сезам: как убрать вывод при запросах?
Я ищу решение для того, чтобы "удалить" логический вывод во время запроса, запущенного в "Сезам". Я должен использовать репозиторий "Native Java Store RDF Schema", и у меня есть такой запрос: у меня есть экземпляр NamedIndividual, и я хочу URI класса, экземпляр которого это:
SELECT DISTINCT ?uri WHERE {
<http://www.semanticweb.org/ontotest#myInstance> rdf:type ?uri .
FILTER (?uri rdf:type owl:Class)
}
Проблема в том, что я получаю несколько URI (кому хороший URI) вместо одного из-за логического вывода. Я получаю суперклассы онтологии, тогда нет никакой связи с классом экземпляра. Как получить правильный результат без изменения хранилища?
2 ответа
Установите setIncludeInferred(false) для вашего объекта Query перед выполнением его через API, чтобы избежать использования выводимых операторов.
Похоже, вы пытаетесь вернуть наиболее конкретный класс (ы), экземпляром которого является отдельный человек. В ответе ThomasFrancart объясняется, как отключить логический вывод, но вы можете этого не делать, потому что вам может потребоваться логический вывод, чтобы вывести наиболее конкретный экземпляр. Например, у вас может быть иерархия классов с отношением
SeniorCitizen ⊑ Person
Человек A имеет некоторое целое число [>= 60] ⊑ SeniorCitizen
и данные:
Джон рдф: тип Персона
Джон имеет возраст 62
Тогда, если вы отключите логический вывод, вы не сможете узнать, что Джон является SeniorCitizen, даже если это более специфический класс, чем Person. Похоже, вы на самом деле хотите, чтобы логический вывод был включен, но чтобы вы возвращали только самый определенный класс (ы). Вы можете сделать это с помощью запроса:
select ?class where {
:myInstance rdf:type ?class .
filter not exists {
?subclass rdfs:subClassOf* ?class .
:myInstance rdf:type ?subclass .
filter ( ?subclass != ?class )
}
}
Это говорит о том, чтобы найти эти значения ?class
такой, что :myInstance
является элементом ?class
, но только там, где нет ?subclass
это подкласс ?class
(Кроме как ?class
сам) к которому :myInstance
также принадлежит. Обратите внимание, что экземпляр может иметь несколько наиболее специфических классов.
Увидеть:
- получение наиболее специфических классов экземпляров (ваш вопрос почти дубликат этого)
- Как получить наименьшего общего потребителя в онтологии с помощью SPARQL Query? (не тот же вопрос, но ответ использует похожую технику)