我有一个特定的类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?
感谢您的任何指示
答案 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
手动完成。