1

我正在尝试在我创建的 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))。

4

0 回答 0