Транзитивный вывод с OWL-RL на RDFLIB

Я пытаюсь использовать резонер OWL на графике RDF, который я создал с помощью rdflib, следующим образом:

ex = Namespace('http://example.org#')

g = Graph()
g.bind("ex", ex)

g.add((ex.Bob, ex.drives, ex.Car))
g.add((ex.Car, RDF.type, ex.Truck))
g.add((ex.Truck, RDFS.subClassOf, ex.Vehicle))

(Автомобиль на самом деле не является типом грузовика, но я просто пытаюсь рассуждать).

После выполнения логического рассуждения моя цель состоит в том, чтобы сделать вывод, что если Боб водит машину, а машина является типом грузовика, а грузовик является подклассом транспортного средства, то Боб водит транспортное средство.

Когда я спрашиваю, является ли автомобиль типом транспортного средства, результат будет True:

b = g.query("""
PREFIX ex: <http://example.org#>
ASK {
    ex:Car rdf:type ex:Vehicle .
} 
""")
print('Car is a type of Vehicle:', bool(b)) # prints True

Но когда я спрашиваю, водит ли Боб машину, я получаю False:

b = g.query("""
PREFIX ex: <http://example.org#>
ASK {
    ex:Bob ex:drives ex:Vehicle .
} 
""")
print('Bob drives a vehicle:', bool(b)) # prints False

Из этого вопроса я понял, что могу написать некоторый код для добавления нужных троек < em>после рассуждений. Но если поведение, которое я хочу, уже поддерживается семантикой OWL/RDF, я бы предпочел исправить свой подход и позволить семантике рассуждений делать свою работу. Я чувствую, что могу упустить фундаментальный принцип того, как должен работать вывод, но я новичок в этой области и не уверен, что делаю неправильно. Любая помощь будет оценена по достоинству.

(Я использовал owlrl для рассуждений, запустив DeductiveClosure(OWLRL_Semantics).expand(g)).


person Joel Oduro-Afriyie    schedule 03.03.2021    source источник
comment
Я не понимаю. Что не работает? У вас есть график, затем вы расширяете график, затем запускаете запрос на расширенном графике. Готово   -  person UninformedUser    schedule 04.03.2021
comment
О, я уже делаю это. Мой вопрос заключается в том, что после расширения графика я хочу сделать вывод, что Боб водит машину. Когда я запускаю этот запрос (управляет ли Боб машиной?) на расширенном графике, он возвращает False. Спасибо за указание на двусмысленность - я отредактировал вопрос, чтобы уточнить.   -  person Joel Oduro-Afriyie    schedule 04.03.2021
comment
Вы также можете спросить ex:Bob ex:drives ex:Truck. Вы также получите False. ex:Car — индивидуум, ex:Truck и ex:Vehicle — классы.   -  person Stanislav Kralin    schedule 08.03.2021