gpt4 book ai didi

Jena 在尝试转换为 OntClass 时抛出 ConversionException

转载 作者:行者123 更新时间:2023-12-04 05:38:39 25 4
gpt4 key购买 nike

我有一个特定的类 URI,我正在尝试为其获取 OntClass。该模型是常规模型。

我写了一些代码来找出模型中是否有正确的语句,似乎它们是,所以我无法理解为什么它不会让我将其视为 OntClass。 (tblURI 是作为方法参数传递的字符串)

Resource tblR = m.createResource(tblURI);
List<Statement> prp = tblR.listProperties().toList();
for(Statement s : prp)
System.out.println(s);
System.out.println(tblR.canAs(OntClass.class));
OntClass tbl = tblR.as(OntClass.class);

这是输出:
[kps:datasource/EnsembleMS#translation_stable_id, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://www.w3.org/2002/07/owl#Class]
[kps:datasource/EnsembleMS#translation_stable_id, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://www.w3.org/2000/01/rdf-schema#Class]
[kps:datasource/EnsembleMS#translation_stable_id, http://www.w3.org/2000/01/rdf-schema#isDefinedBy, kps:datasource/EnsembleMS]
[kps:datasource/EnsembleMS#translation_stable_id, http://www.w3.org/2000/01/rdf-schema#label, "translation_stable_id"]
false
com.hp.hpl.jena.ontology.ConversionException: Cannot convert node kps:datasource/EnsembleMS#translation_stable_id to OntClass: it does not have rdf:type owl:Class or equivalent
at com.hp.hpl.jena.ontology.impl.OntClassImpl$1.wrap(OntClassImpl.java:81)
at com.hp.hpl.jena.enhanced.EnhNode.convertTo(EnhNode.java:155)
at com.hp.hpl.jena.enhanced.EnhNode.convertTo(EnhNode.java:34)
at com.hp.hpl.jena.enhanced.Polymorphic.asInternal(Polymorphic.java:66)
at com.hp.hpl.jena.enhanced.EnhNode.as(EnhNode.java:110)
at com.KPS.myApp.exampleMethod(myApp.java:123)

为什么它会抛出异常,如何使用 uri tblURI 获取资源的 OntClass?

感谢您的任何指点

最佳答案

你不说是什么型号m是。特别是,如果 m是使用 RDFS 语言配置文件创建的,OntModel将寻找 rdf:typerdfs:Class ,不是 owl:Class .如果这不是问题,那么一个完整的最小(即可运行)示例会有所帮助。

顺便说一句,我可以看到另一个问题:模型中的资源 URI 应该是绝对形式,而不是缩写形式。您的模型中有 q-name URI 的事实,例如 kps:datasource/EnsembleMS#translation_stable_id ,表明您的前缀处理出现问题。这本身不会导致您报告的问题,但这是一个需要调查的危险信号。

更新

回答问题:

  • 是的,您需要使用 OntModel,否则 OntClass 不可能知道要使用哪个语言配置文件。将模型创建为 OntModel首先:
    OntModel m = modelFactory.createOntologyModel( OntModelSpec.OWL_MEM );

    或将您的普通模型包装为 OntModel :
    OntModel om = modelFactory.createOntologyModel( OntModelSpec.OWM_MEM, m );

    当然,您可以随意使用任何型号规范,OWL_MEM只是一种选择。
  • createResource不会为您扩展前缀。因此,您应该在创建资源之前自行扩展它们:
    m.createResource( m.expandPrefix( "foo:bar" ) );

    当然,这需要前缀"foo"注册为前缀。如果您阅读在其语法中定义前缀的 RDF 文档,这会自动发生,否则可以使用 setNsPrefix 手动完成。 .
  • 关于Jena 在尝试转换为 OntClass 时抛出 ConversionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11581494/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com