OWLAPI - 如何添加声明和基数等参考?

时间:2015-01-10 15:29:49

标签: java scala jena owl protege

我正在尝试使用OWL-API 3.5.0从数据模型以编程方式构建OWL文件。

通常,该模型遵循A - >的形式。 B,其中关系(“ - >”)可以是子类或属性。

我认为我的子类有效,但我不确定如何添加以下内容。

  1. 声明。 Protegé为IRI提供以下内容:
  2. <Declaration> <DataProperty IRI="#foo"/> </Declaration>

    使用OWL-API,我根本不知道这会发生什么。

    1. 基数和数据类型。我可以获得一个基数的引用,但我不知道要创建什么样的Axiom,以便我可以将它添加到我的本体中,而且我不确定我应该添加它。< / LI>

      例如,对于#Name,我有一个#firstName数据属性,还有一个#hasName。我目前的流程是:

      val topProperty = df.getOWLTopDataProperty val hasChild = df.getOWLDataProperty(exampleIRI + "#has" + concept.getName) val child = df.getOWLDataProperty(exampleIRI + "#" + concept.getName) m.applyChange(new AddAxiom(o, df.getOWLDeclarationAxiom(child))) val parentConcept = findConcept(concept.getRelated, concepts).get val parent = df.getOWLClass(exampleIRI + "#" + parentConcept.getName)

      我尝试用

      设置数据范围

      val dataRange=df.getOWLDatatypeRestriction( df.getOWLDataType("string") val classExp = df.getOWLDataSomeValuesFrom(child, dataRange) m.applyChange(new AddAxiom(o, df.getOWLSubClassOfAxiom(parent, classExp)))

      但这......不能正常工作。 Protegé向我展示了基数已被破坏,并且当我手动创建结构时,它会使用“&amp; xsd; string”类型正确设置基数,我的代码不会复制它。

      我理解本体是如何构建的(我很痛苦地意识到我可能不知道我知道多少),但我在Protegé中有一个工作的OWL(可以转换)有效的XSD,这是最终目标);我根本不知道如何弥合Protegé生成的文件和OWL-API生成的内容之间的差距。

      我尝试使用Jena,但对我来说甚至不太清楚,而Protegé据说有一个看起来像的客户端库,它将是OWL-API和我的数据模型之间的优秀层,但是根据他们的文档,Protegé库甚至不会从源代码构建。

1 个答案:

答案 0 :(得分:3)

宣言公理

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

这种公理是一种宣言公理。请查看OWLDeclarationAxiomgetOWLDeclarationAxiom(OWLEntity owlEntity)。如果您已经对使用OWLAPI感到满意,那么这些链接应该足以让您前进。一旦为实体创建了声明公理,就可以像任何其他公理一样将它添加到本体中。

事实上,您似乎已经在第二个Java代码示例中这类事情了。如果您没有得到您期望的结果,请提供一个更具体,最简单的示例,说明哪些不起作用。

基数

我不太确定你在这里想要完成什么。也就是说,从您的代码中,我不清楚您最终想要使用哪些公理。听起来你有类似和属性 hasFirstName 的东西,你想断言

  

Person⊑= 1 hasFirstName.String

为了说 Person 只有一个来自字符串数据类型的名字。有两个类表达式, Person = 1 hasFirstName.String ,然后您只需在它们之间断言子类公理。获取 Person 类的引用并创建和添加子类公理不应该太难,但精确量化的基数限制可能有点棘手。对于它,您使用getOWLDataExactCardinality(cardinality, property, dataRange)。你可以使用Ignazio在this answer中提到的任何一种技术获得你需要的数据范围(xsd:string):

OWLDatatype string = OWL2Datatype.XSD_STRING.getDatatype(df)
OWLDatatype string = df.getOWLDatatype(XSDVocabulary.parseShortName("xsd:string"));