2

我有一个特定的类 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?

感谢您的任何指点

4

1 回答 1

3

你不说是什么样的模型m。特别是,如果m是使用 RDFS 语言配置文件创建的,OntModel则将寻找rdf:typeof rdfs: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.

于 2012-07-23T11:15:46.303 回答