Я пытаюсь использовать резонер 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)
).
ex:Bob ex:drives ex:Truck
. Вы также получитеFalse
.ex:Car
— индивидуум,ex:Truck
иex:Vehicle
— классы. - person Stanislav Kralin   schedule 08.03.2021