我正在使用 Protégé 5.1.0(加上 HermiT 1.3.8.413 Reasoner)中的 OWL 本体,我稍后想与 OWLAPI 4.1.0 以及可能的 DL-Query 或 SPARQL 一起使用。我手头的任务是让某个类的所有个体都没有完成某个对象属性。由于开放世界假设,未实现的对象属性通常不会显示为问题,但我需要这些信息并且希望避免编写自己的代码来检查整个本体。
我准备了我的小例子,作为可读的文本和海龟代码:
类:比萨饼,浇头
对象属性:有
断言:披萨 有一些配料
个人:Pizza1、Pizza2、Topping1、Topping2(各自类别)
断言:Pizza1有Topping1
代码:
@prefix : <http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23> .
<http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23> rdf:type owl:Ontology .
#################################################################
# Object Properties
#################################################################
### http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#has
:has rdf:type owl:ObjectProperty ;
owl:inverseOf :isOn .
### http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#isOn
:isOn rdf:type owl:ObjectProperty ,
owl:FunctionalProperty .
#################################################################
# Classes
#################################################################
### http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#Pizza
:Pizza rdf:type owl:Class ;
rdfs:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty :has ;
owl:someValuesFrom :Topping
] .
### http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#Topping
:Topping rdf:type owl:Class .
#################################################################
# Individuals
#################################################################
### http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#Pizza1
:Pizza1 rdf:type owl:NamedIndividual ,
:Pizza ;
:has :Topping1 .
### http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#Pizza2
:Pizza2 rdf:type owl:NamedIndividual ,
:Pizza .
### http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#Topping1
:Topping1 rdf:type owl:NamedIndividual ,
:Topping ;
:isOn :Pizza1 .
### http://www.semanticweb.org/user/ontologies/2017/0/untitled-ontology-23#Topping2
:Topping2 rdf:type owl:NamedIndividual ,
:Topping .
#################################################################
# General axioms
#################################################################
[ rdf:type owl:AllDifferent ;
owl:distinctMembers ( :Pizza1
:Pizza2
)
] .
[ rdf:type owl:AllDifferent ;
owl:distinctMembers ( :Topping1
:Topping2
)
] .
### Generated by the OWL API (version 4.2.6.20160910-2108) https://github.com/owlcs/owlapi
在这种情况下,我想查询本体并获取Pizza2当前没有任何Topping的信息,即它的Object Property没有被断言或推断。此外,如果 Topping1 更改为不同的类,我现在希望看到 Pizza1 也出现在查询中,因为“ Pizza has some Topping ”不满意。
有没有一种优雅的方法可以直接在 OWLAPI 中或使用 DL-Query/SPARQL 来执行此操作?