【问题标题】:OWL java use same data property for two classesOWL java对两个类使用相同的数据属性
【发布时间】:2018-04-12 09:10:49
【问题描述】:

我正在使用 OWL,我定义了 2 个类,它们共享一个数据属性:

<Declaration>
    <DataProperty IRI="#hasLastName" />
</Declaration>

<DataPropertyDomain>
    <DataProperty IRI="#hasLastName" />
    <Class IRI="#Class1" />
</DataPropertyDomain>

<DataPropertyDomain>
    <DataProperty IRI="#hasLastName" />
    <Class IRI="#Class2" />
</DataPropertyDomain>

在 java 中,我创建了一个项目,该项目从一个 owl 文件和一个 xml 文件开始,它创建了一个表单。 在我的 xml 文件中,我以这种方式定义表单的各个部分:

<section>
        <iri>http://www.sample.com/myontology#class1</iri>
        <infoList>
            <info type="text" property="http://www.sample.com/myontology#hasLastName" required="true" />
            <info type="text" property="http://www.sample.com/myontology#hasFirstName" required="true" />
            <info type="text" property="http://www.sample.com/myontology#hasEmail" required="false" />
            <info type="text" property="http://www.sample.com/myontology#hasPhone" required="false" />
        </infoList>
</section>


<section>
        <iri>http://www.sample.com/myontology#class2</iri>
        <infoList>
            <info type="text" property="http://www.sample.com/myontology#hasLastName" required="true" />
            <info type="text" property="http://www.sample.com/myontology#hasUser" required="false" />
            <info type="text" property="http://www.sample.com/myontology#hasRole" required="false" />
        </infoList>
</section>

如何访问第 1 类和第 2 类的不同姓氏属性? 我通过http://www.sample.com/myontology#hasLastName检索它 有类似http://www.sample.com/myontology#Class1#hasLastName 的东西吗?

对不起,我是本体的初学者,对我来说不是很清楚

【问题讨论】:

  • ehm,这听起来更像是“如何在Java 中查询XML 数据?” 要么遍历DOM,要么分别使用XPath。 XQuery
  • 不,我可以查询 xml 并检索数据,我想知道是否有办法获取已定义类的 OWL 属性。我对两个类使用相同的属性。
  • 这取决于您使用什么 API 来读取 OWL 文件。您使用的是什么 API?
  • 我正在使用 OWL API
  • 现在,只需使用 OWL API 的方法。顺便说一句,类的属性这样的表述具有误导性。一个类没有属性。

标签: java owl


【解决方案1】:

假设你有一个本体如下:

Datatype: xsd:string

DataProperty: hasLastName
    Domain: 
        Person,
        Student

    Range: 
        xsd:string        

Class: Person

Class: Student

以下代码将检索 2 个域:

IRI lastNamePropertyIRI = IRI.create(ontologyIRI + "#hasLastName");
OWLDataProperty lastNameProperty = dataFactory.getOWLDataProperty(lastNamePropertyIRI);
List<OWLClassExpression> domainClasses = 
   ontology
      .dataPropertyDomainAxioms(lastNameProperty)
      .map(OWLDataPropertyDomainAxiom::getDomain)
      .collect(Collectors.toList());

  for (OWLClassExpression owlClass : domainClasses) {
    logger.trace("Domain class = " + owlClass);
  } 

但是,这里还有一些我关心的其他问题与本体有关,而不是与代码有关。

对于我给出的本体,每当您指定个人 john 通过 hasLastName 链接到某个姓氏时,本体推理器将推断 johnboth 和 @987654326 @和一个Student,即hasLastName的域是PersonStudent的交集。显然,这对一般人来说是不正确的。根据您的需要,有两种可能的解决方案:

(1) 您可以指定hasLastName 的域为Person or Student,这将使该域成为PersonStudent 的并集。

(2) 我更喜欢的解决方案是将Student 定义为Person 的子类,然后声明hasLastName 的域是单个类Person

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多