我正在使用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]
- 为什么 SPARQL 不返回所有关系?
- 如何查询属于“素食食品”子类或与其他对象属性相关的所有类?
- 另外,如何查询上例中的“AND”和“OR”组件?
我确实接受非 python 解决方案,只要它可以自动化。Protege 有一个 DL 查询选项卡,但我认为我无法使用 UI 导出结果...
谢谢!