首先我知道这个话题可能会重复,但实际上我还有更多问题。我正在使用 Jena 来操作 OWL 本体。给定一个 class A
,我想找到A
作为其域的所有属性,无论是显式的还是推断的。
让我们考虑以下本体:A1 subClassOf A; P domain A; P range B;
我使用 DL 规则推理创建了一个本体模型,这应该打开推理器。
ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF)
解决方法介绍了两种执行此任务的方法:
- 使用
listDeclaredProperties()
:这是 cls 是我的 OntClass 的代码
ExtendedIterator<OntProperty> exItr;
exItr = cls.listDeclaredProperties(false);
while (exItr.hasNext()) {
OntProperty prop = exItr.next();
System.out.println("Object Property Name: "+ prop.getLocalName());
System.out.println("Domain: "+ prop.getDomain());
System.out.println("Range: "+ prop.getRange());
}
这将检索正确答案:其域是A
显式和推断的属性,但打印的域和范围设置为 Thing。这是 和 的A
输出A1
:
Object Property Name: P
Domain: http://www.w3.org/2002/07/owl#Thing
Range: http://www.w3.org/2002/07/owl#Thing
问题 1
为什么会发生这种情况(Thing
在域和范围内)?
此外,如果某些属性的域是交集,则忽略它,即 if P domain A intersection B
,我称之为 for A
,P
不会被检索,这是典型的,因为A intersection B
是 a subClassOf A
。
问题2
但是,我怎样才能检索他们的域是A
或者 a的属性subClassOf A
以便检索A intersection B
?
- 使用
listStatements
This 仅检索明确说明的答案,即:
StmtIterator it = model.listStatements(null, RDFS.domain, cls);
while (it.hasNext()) {
Statement stmt = it.next();
System.out.println("Object Property Name: "+ prop.getLocalName());
System.out.println("Domain: "+ stmt.getSubject());
}
这没有给出任何结果A1
。这是结果A
Object Property Name: P
Domain: http://www.w3.org/2002/07/owl#A
Range: http://www.w3.org/2002/07/owl#B
问题 3
为什么会发生这种情况(只有明确的结果)?以及如何检索显式和推断结果?
此外,这种方式还检索属性A
或其A intersection B
域(问题2的答案),为什么会发生这种情况?我有点迷路了。