2

我正在使用FoodOn本体,需要确定某个类是否与另一个类有某种关联。典型用例:素食者可以吃蜂蜜吗?不,因为蜂蜜是“无脊椎动物食品”的一个子类!

我正在使用 python owlready2 库,它允许我运行 SPARQL 查询和查询子类关系,如下所示:

SELECT  ?class
WHERE
{
  # honey
  <http://purl.obolibrary.org/obo/UBERON_0036016> rdfs:subClassOf* ?class .
  # animal food product
  ?class rdfs:subClassOf* <http://purl.obolibrary.org/obo/FOODON_00001176>
}

这段代码为我提供了蜂蜜和动物食品之间的完整子类路径——太好了。

我的问题是,这种关系并不总是子类的关系。让我们看看使用 Protege 编辑器的“素食产品”:

门生截图

我们可以看到,“素食食品”是“有机食品”的一个子类,但同时它也等价于“食品”和(而不是(“派生自”一些(“无脊椎动物”或“脊椎动物”动物')))

如果我使用 SPARQL 查看所有三元组,我会得到子类关系,但等价类只是一个 bnode:

(rdflib.term.URIRef('http://www.w3.org/2000/01/rdf-schema#subClassOf'),
  rdflib.term.URIRef('http://purl.obolibrary.org/obo/FOODON_00002381')),
(rdflib.term.URIRef('http://www.w3.org/2002/07/owl#equivalentClass'),
  rdflib.term.BNode('5846'))

[stripped some output]
  1. 为什么 SPARQL 不返回所有关系?
  2. 如何查询属于“素食食品”子类或与其他对象属性相关的所有类?
  3. 另外,如何查询上例中的“AND”“OR”组件?

我确实接受非 python 解决方案,只要它可以自动化。Protege 有一个 DL 查询选项卡,但我认为我无法使用 UI 导出结果...

谢谢!

4

0 回答 0