当前位置: 首页 > 知识库问答 >
问题:

如何更新一个OWL本体文件,以便添加一个具有某些属性的新个体?

虞祯
2023-03-14

我的目标如下:

  • 添加新的单个#IndividualSimpleSubType
  • 将类型#SimpleSubType添加到此个体(#SimpleSubType#SimpleType的子类)
  • 向此个体添加以下对象属性断言:与#PropertyValue1
  • 关联的 #HasProperty1
  • 向此个体添加以下对象属性断言:与#PropertyValue2
  • 关联的 #HasProperty2

本体中已经存在以下信息:

    null
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();

try {
    OWLOntology ontology = manager.loadOntologyFromOntologyDocument(new File("ontology.owl"));

    IRI ontologyIRI = ontology.getOntologyID().getOntologyIRI();
    PrefixManager prefixManager = new DefaultPrefixManager(ontologyIRI.toString().concat("#"));

    OWLDataFactory dataFactory = manager.getOWLDataFactory();

    OWLReasonerFactory reasonerFactory = new StructuralReasonerFactory();
    OWLReasoner reasoner = reasonerFactory.createReasoner(ontology);
    reasoner.precomputeInferences();

    // Get all subclasses of SimpleType stored within the loaded ontology.
    OWLClassNodeSet clsSimpleSubTypes = new OWLClassNodeSet();
    OWLClass simpleTypeClass = dataFactory.getOWLClass(":SimpleType", prefixManager);
    clsSimpleSubTypes.addDifferentEntities(reasoner.getSubClasses(simpleTypeClass, true).getFlattened());

    // Get two object properties stored within the loaded ontology.
    OWLObjectPropertyExpression objProperty1 = dataFactory.getOWLObjectProperty(IRI.create(ontologyIRI + "#hasProperty1"));
    OWLObjectPropertyExpression objProperty2 = dataFactory.getOWLObjectProperty(IRI.create(ontologyIRI + "#hasProperty2"));

    // Get two property values stored within the loaded ontology.
    OWLNamedIndividual propertyValue1 = dataFactory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#PropertyValue1"));
    OWLNamedIndividual propertyValue2 = dataFactory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#PropertyValue2"));

    for (OWLClass cls : clsSimpleSubTypes.getFlattened())
    {
        if (cls.getIRI().toString().endsWith("#SimpleSubType")) {
            // Create the new individual
            OWLNamedIndividual po = factory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#individualSimpleSubType"));

            // individualSimpleSubType is of type SimpleSubType
            OWLClassAssertionAxiom assertion = dataFactory.getOWLClassAssertionAxiom(cls, po);
            manager.addAxiom(ontology, assertion);

            // individualSimpleSubType has object property PropertyValue1
            OWLObjectPropertyAssertionAxiom objProperty1Axiom = dataFactory.getOWLObjectPropertyAssertionAxiom(objProperty1, po, propertyValue1);
            manager.addAxiom(ontology, objProperty1Axiom);

            // individualSimpleSubType has object property PropertyValue2
            OWLObjectPropertyAssertionAxiom objProperty2Axiom = dataFactory.getOWLObjectPropertyAssertionAxiom(objProperty2, po, propertyValue2);
            manager.addAxiom(ontology, objProperty2Axiom);

            break;
        }
    }

    //File destinationFile = new File("ontology-new-data.owl");
    //OWLOntologyFormat format = manager.getOntologyFormat(ontology);
    //manager.saveOntology(ontology, format, IRI.create(destinationFile.toURI()));
    manager.saveOntology(ontology);
} catch (OWLOntologyCreationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (OWLOntologyStorageException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
<!-- http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#individualSimpleSubType -->

<owl:NamedIndividual rdf:about="http://www.semantichtml" target="_blank">web.org/vincenzo/ontologies/2015/7/ontology.owl#individualSimpleSubType">
    <rdf:type rdf:resource="http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#SimpleSubType"/>
    <hasProperty1 rdf:resource="http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#PropertyValue1"/>
    <hasProperty2 rdf:resource="http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#PropertyValue2"/>
</owl:NamedIndividual>

但是,如果我使用上面的Java代码,保存ontology还涉及到对其他行的修改:在文件中添加与上面相同的XML行,但也修改其他行,如下所示。

folliwing行写在上面的Java代码保存的OWL文件的开头(但当我在执行相同的修改后使用Protégé保存本体时,这些行不是写的)。

<!DOCTYPE rdf:RDF [
    <!ENTITY terms "http://purl.org/dc/terms/" >
    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY skos "http://www.w3.org/2004/02/skos/core#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>

然后,在一些标签的属性中添加了一定的前缀,所以:

    null

这种怪异行为的原因是什么?

在我的Eclipse项目中,我导入了与OWL API 3.4.2相关的jar文件,该文件与Protegé4.3.0中集成的版本相同。

共有1个答案

越望
2023-03-14

问题是当从文件中读取原始本体时,它的前缀没有被保留。这在OWL API的最新版本中得到了修正。3.5.2和4.0.2(4.1.0尚未发布)应该允许您找到本体格式对象中设置的前缀。

为了保证这些前缀也用于实体(例如,用于&rdf;),您应该调用

XmlWriterPreferences.GetInstance().SetUseNamespaceEntities(true);

 类似资料:
  • 我需要在另一个相关实体更新后对一个实体执行更新。 我有两个实体:和,关系为1:N。两者都有字段。状态取决于所有子状态字段。因此,如果更新了一个,我需要重新计算的新状态并持久化/更新它。 我实现了一个监听器: 监听器在中进行了注释,并且正在正确调用它。但是,在流程完成后,仍然保持旧状态,即使使用正确的新状态调用。

  • 我正在使用齐柏林飞艇0.6.2和火花2.0。 我尝试在循环中执行查询,但效果不是很好。 我需要循环一个数据帧的每一行,大约5000行,并执行一个查询,这将在另一个数据帧中增加一个值。 以下是我的尝试: 我试着从两个数据帧中提取一小部分,但仍然很慢。我觉得我做得不对。 知道如何快速更新数据帧吗?

  • 接口说明 将数据整合到一个地方进行查询,Wish3DEarth团队新增了添加场景的接口,来进行数据的整合操作 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/scene/1.0.0/add 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 title string form 是 场景名称 descrip

  • 如何更新一个 monorepo仓库中的某个依赖? 就是比如 monorepo中有个依赖叫 lodash 如何集体更新之,而不是一个一个改版本

  • 问题内容: 我正在寻找@ font-face CSS规则的MDC页面,但我一无所获。我分别使用粗体 , 斜体 和 粗体+斜体文件 。如何将所有三个文件嵌入一条规则?例如,如果我有: 浏览器将不知道用于粗体显示的字体(因为该文件是DejaVuSansBold.ttf),因此它将默认为我可能不想要的字体。我如何才能告诉浏览器某种字体的所有不同变体? 问题答案: 解决方案似乎是添加多个规则,例如: 顺便

  • 问题内容: 我正在NHibernate中对单个属性执行标准更新。但是,在提交事务时,sql更新似乎设置了我映射到表上的所有字段,即使它们没有更改。当然这不是Nhibernate中的正常行为吗?难道我做错了什么?谢谢 问题答案: 这是正常现象。您可以尝试添加到类定义中以覆盖此行为。