2012-07-20 3 views
2

필자는 OntClass를 얻으려는 특정 클래스 URI를 가지고 있습니다. 모델은 정규 모델입니다.JDK가 Ontology에 캐스팅하려고 할 때 ConversionException을 던졌습니다.

필자는 올바른 진술이 모델에 있는지를 알아 내기 위해 몇 가지 코드를 작성했기 때문에 이것이 내가 왜 OntClass로 보지 못하게되는지 이해할 수없는 것처럼 보입니다.

[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를 얻을 수 있습니다 :

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); 

이것은 출력 (tblURI는 메소드의 매개 변수로 전달되는 문자열이다)? 어떤 포인터

답변

3

에 대한

덕분에 당신은 m 모델의 어떤 종류의 말을하지 않습니다. 특히 m이 RDFS 언어 프로필로 생성 된 경우 OntModelrdf:type이 이 아니라 owl:Class이 될 것입니다. 그것이 문제가되지 않는다면 완전한 최소 (즉 실행 가능한) 예가 도움이 될 것입니다.

그런데 또 다른 문제가 있습니다. 모델의 리소스 URI는 축약 된 형식이 아닌 절대 형식이어야합니다. kps:datasource/EnsembleMS#translation_stable_id과 같이 모델에 q-name URI가 있다는 사실은 접두사 처리에 문제가 있음을 나타냅니다. 그 자체만으로는 문제를 일으키지는 않겠지 만, 조사하는 것은 적기입니다.

업데이트

질문에 응답 :

  • 네, 당신은 OntModel를 사용하는 데 필요한 OntClass 사용하는 langauge 프로필 아는 그렇지 않으면 수 없습니다.

    OntModel m = modelFactory.createOntologyModel(OntModelSpec.OWL_MEM); 
    

    을하거나 OntModel로 일반 모델을 포장 : 하나 처음에 OntModel 같은 모델을 만들 물론

    OntModel om = modelFactory.createOntologyModel(OntModelSpec.OWM_MEM, m); 
    

    , 당신은 많은 사용 모델 사양의 경우로하십시오, OWL_MEM은 하나의 옵션 일뿐입니다.

  • createResource 접두어를 확장하지 않습니다. 그래서, 당신은 자원을 작성하기 전에 그들에게 자신을 확장해야합니다

    물론
    m.createResource(m.expandPrefix("foo:bar")); 
    

    ,이 접두사로 등록 할 접두사 "foo"이 필요합니다. 이 구문에서 접두사를 정의하는 RDF 문서를 읽는 경우 자동으로 발생하지만 그렇지 않은 경우 setNsPrefix을 사용하여 수동으로 수행 할 수 있습니다.

+0

제 질문의 첫 줄에 m은 정규 모델, 즉 OntModel이 아닙니다. OntClass를 얻기 위해서는 m이 OntModel 일 필요가 있습니까? 그렇다면 모델을 OntModel로 변환하는 가장 좋은 방법은 무엇입니까? – ec2011

+0

접두사와 관련하여 m.createResource()에 접두사가 붙은 URI를 매개 변수로 제공하는 것이 좋습니까? – ec2011

+0

편집 된 질문에서 질문에 대한 답변을보십시오. –

관련 문제