RDFLIB上带OWLR的传递性推理

2024-04-29 01:53:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在RDF图上使用OWL推理器,我使用rdflib创建了RDF图,如下所示:

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))

(汽车并不是真正的卡车,但我只是在尝试推理机)

运行reasoner之后,我的目标是能够推断,如果Bob驾驶一辆汽车,汽车是卡车的一种类型,卡车是车辆的一个子类,那么Bob驾驶一辆汽车

当我问一辆车是否是一种车辆时,结果是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

我从this question中意识到,在推理完成后,我可以编写一些代码来添加我想要的三元组。但是,如果我想要的行为已经得到OWL/RDF语义的支持,我更愿意纠正我的方法,让推理语义完成它的工作。我觉得我可能缺少了一个基本的推理原理,但是我是这方面的新手,我不确定我做错了什么。任何帮助都将不胜感激

(我通过运行DeductiveClosure(OWLRL_Semantics).expand(g)使用^{}进行推理)


Tags: orgaddhttpexampletyperdfcarowl