首先我知道这个话题可能会重复,但实际上我还有其他问题。
我使用Jena来操纵OWL本体。给定一个类A
,我想找到A
是其域名的所有属性,无论这是明确的还是推断的。
让我们考虑以下本体:A1 subClassOf A; P domain A; P range B;
我创建了一个带有DL规则推理的本体moel,这应该会打开推理器。
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
为什么会发生这种情况(Thing
在域和范围内?
此外,如果某个属性的域是交集的,则忽略它,即如果P domain A intersection B
,并且我将其称为A
,则不会检索P
,这是典型的,因为A intersection B
是subClassOf A
。
但是,如何检索其域A
或subClassOf A
的属性以便检索A intersection B
?
listStatements
这只检索明确说明的答案,即:
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
为什么会发生这种情况(只有明确的结果)?以及如何检索显式和推断结果?
此外,这种方式还会检索A
或A intersection B
是其域名的属性(问题2的答案),为什么会发生这种情况?我有点失落。
答案 0 :(得分:4)
这将检索正确的答案:其域名为A的属性 显式和推断,但打印的域和范围设置为 事情。这是A和A1的输出:
Object Property Name: P Domain: http://www.w3.org/2002/07/owl#Thing Range: http://www.w3.org/2002/07/owl#Thing
为什么会发生这种情况(域和范围内的事情)?
OWL中的属性可以包含任意数量的域和范围。当属性P将D作为域时,这意味着每当您看到断言P(x,y)时,您都可以推断 x是D的实例。这意味着在OWL中,owl :Thing是每个属性的域,因为每个断言的主题必须是owl的实例:Thing。现在,考虑耶拿OntProperty#getDomain()的文档(强调添加):
回答代表此属性的域类的资源。 如果有多个这样的资源,则任意选择 制成。
Jena返回属性域的一个。猫头鹰:东西是财产的一个领域,所以猫头鹰:东西是一个有效的回应。如果要查看所有域,则需要使用OntProperty#listDomain()。
但是,如何检索其域所属的属性 A或subClassOf A是为了检索交叉点B?
您需要使用推理器,即使使用推理器,也可能更容易将其表达为SPARQL查询。然后,您可以更简洁地编写查询:
select ?property where {
?property rdfs:domain/rdfs:subClassOf* ex:A
}
此查询将获取其域为A或A的子类的所有属性。但是,您仍然需要推理器,以便推断A和B的交集是A的子类。
为什么会发生这种情况(只有明确的结果)?以及如何检索显式和推断结果?
如果您使用推理器,则只会推断出结果。 Jena的reasoners也不是逻辑上完整的,这意味着有一些结果是合法的OWL结果,Jena&#39; s reasoners不会产生。您可能遇到过其中一种情况,或者代码中可能仍然存在问题。但是,在这些情况下,您可能应该生成一个完整的工作示例并使用完整的代码提出问题,以及我们可以用来重现问题的完整本体。您还应该尝试不同的reasoners(Jena提供的其他reasoners以及Pellet,HermiT和&amp; c等reasoners。)。