0

首先我知道这个话题可能会重复,但实际上我还有更多问题。我正在使用 Jena 来操作 OWL 本体。给定一个 class A,我想找到A作为其域的所有属性,无论是显式的还是推断的。

让我们考虑以下本体:A1 subClassOf A; P domain A; P range B; 我使用 DL 规则推理创建了一个本体模型,这应该打开推理器。

ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF)

解决方法介绍了两种执行此任务的方法:

  1. 使用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 AP不会被检索,这是典型的,因为A intersection B是 a subClassOf A

问题2

但是,我怎样才能检索他们的域是A或者 a的属性subClassOf A以便检索A intersection B

  1. 使用listStatementsThis 仅检索明确说明的答案,即:

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的答案),为什么会发生这种情况?我有点迷路了。

4

1 回答 1

4

这会检索到正确答案:其域是显式和推断的 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

为什么会发生这种情况(域和范围内的事物)?

OWL 中的属性可以有任意数量的域和范围。当属性 P 有 D 作为域时,这意味着任何时候你看到一个断言 P(x,y),你都可以推断出x 是 D 的一个实例。这意味着在 OWL 中,owl:Thing 是每个属性,因为每个断言的主题必须是 owl:Thing 的一个实例。现在,考虑 Jena 的OntProperty#getDomain()的文档(添加了重点):

回答表示此属性的域类的资源。 如果有多个这样的资源,则进行任意选择。

Jena 返回属性的域之一。owl:Thing 是属性的域,因此 owl:Thing 是合法响应。如果要查看所有域,则需要使用OntProperty#listDomain()

但是,如何检索其域为 A 或 subClassOf A 的属性以检索 A 交集 B?

您需要使用推理器,即使使用推理器,将其表示为 SPARQL 查询可能更容易。然后你就可以更简洁地编写查询:

select ?property where {
  ?property rdfs:domain/rdfs:subClassOf* ex:A
}

此查询将获取域为 A 或 A 子类的所有属性。不过,您仍然需要推理器,以推断 A 和 B 的交集是 A 的子类。

为什么会发生这种情况(只有明确的结果)?以及如何检索显式和推断结果?

如果您使用推理器,则只会有推断的结果。Jena 的推理器在逻辑上也不完整,这意味着有些结果是 Jena 的推理器不会产生的合法 OWL 结果。您可能遇到了其中一种情况,或者代码中可能仍然存在问题。但是,在这些情况下,您可能应该生成一个完整的工作示例并使用完整的代码提出问题,以及我们可以用来重现问题的完整本体。您还应该尝试不同的推理器(Jena 提供的其他推理器以及 Pellet、HermiT 等推理器)。

于 2015-01-13T16:16:51.910 回答