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

时间:2012-07-20 14:36:04

标签: jena

我有一个特定的类URI,我试图获得一个OntClass。该模型是常规模型。

我编写了一些代码来确定正确的语句是否在模型中,并且它们似乎是如此,我无法理解为什么它不会让我将其视为OntClass。 (tblURI是作为​​方法参数传递的String)

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?

感谢您的任何指示

1 个答案:

答案 0 :(得分:3)

您不会说出m是什么类型的模型。特别是,如果使用RDFS语言配置文件创建m,则OntModel将查找rdf:type rdfs:Class,而不是owl:Class。如果那不是问题,那么一个完整的最小(即可运行)的例子会有所帮助。

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

<强>更新

回答问题:

  • 是的,您需要使用OntModel,否则OntClass无法知道要使用哪个langauge配置文件。首先将模型创建为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手动完成。