我正在尝试在我创建的 RDF 图上使用 OWL 推理器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))
(汽车并不是真正的卡车,但我只是在尝试推理)。
运行推理器后,我的目标是能够推断如果 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
我从这个问题中意识到,在推理完成后,我可以编写一些代码来添加我想要的三元组。但是,如果我想要的行为已经得到 OWL/RDF 语义的支持,我宁愿纠正我的方法,让推理语义发挥作用。我觉得我可能错过了推理应该如何工作的基本原则,但我是这个领域的新手,我不确定我做错了什么。任何帮助,将不胜感激。
(我用于owlrl
通过运行进行推理DeductiveClosure(OWLRL_Semantics).expand(g)
)。