我正在尝试使用OWL-API 3.5.0从数据模型以编程方式构建OWL文件。
通常,该模型遵循A - >的形式。 B,其中关系(“ - >”)可以是子类或属性。
我认为我的子类有效,但我不确定如何添加以下内容。
<Declaration>
<DataProperty IRI="#foo"/>
</Declaration>
使用OWL-API,我根本不知道这会发生什么。
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é库甚至不会从源代码构建。
答案 0 :(得分:3)
<Declaration>
<DataProperty IRI="#foo"/>
</Declaration>
这种公理是一种宣言公理。请查看OWLDeclarationAxiom和getOWLDeclarationAxiom(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"));