对于 OWL class A;获取 A 是其域的所有属性

For an OWL class A; Getting all properties that A is their domain

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

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

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。这是 AA1 的输出:

Object Property Name: P
Domain: http://www.w3.org/2002/07/owl#Thing
Range: http://www.w3.org/2002/07/owl#Thing

问题 1

为什么会发生这种情况(Thing 在域和范围内)?

此外,如果某些属性的域是交集,它会被忽略,即如果P domain A intersection B,我为A调用这个,P将不会被检索,这是典型的,因为 A intersection BsubClassOf A

问题 2

但是,如何检索其域为 AsubClassOf A 的属性,以便检索 A intersection B

  1. 使用 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

问题 3

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

此外,这种方式还检索 AA intersection B 是其域的属性(问题.2的答案),为什么会这样?我有点迷路了。

This retrieves correct answer: properties that its domain is A both explicit and inferred, but the printed domains and ranges are set to Thing. This is the output for both A and A1 :

Object Property Name: P
Domain: http://www.w3.org/2002/07/owl#Thing
Range: http://www.w3.org/2002/07/owl#Thing

Why is this happening (Thing in domain and range)?

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

Answer a resource that represents the domain class of this property. If there is more than one such resource, an arbitrary selection is made.

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

However, how can I retrieve the properties which their domain is either A or a subClassOf A in order to retrieve A intersection B?

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

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

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

Why is this happening (only explicit results)? and how to retrieve both explicit and inferred results?

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