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

时间:2015-01-13 14:51:52

标签: java jena owl reasoning

首先我知道这个话题可能会重复,但实际上我还有其他问题。 我使用Jena来操纵OWL本体。给定一个类A,我想找到A是其域名的所有属性,无论这是明确的还是推断的。

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

ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF)

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

  1. 使用listDeclaredProperties():这是cls是我的OntClass
  2. 的代码

    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这只检索明确说明的答案,即:
    2. 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的答案),为什么会发生这种情况?我有点失落。

1 个答案:

答案 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。)。