2012-07-20 41 views
2

我有一個特定的Class URI,我試圖獲取OntClass。該模型是一個常規模型。Jena在試圖轉換爲OntClass時拋出ConversionException

我寫了一些代碼來找出正確的語句是否在模型中,似乎他們是這樣我不明白爲什麼它不會讓我把它看作一個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) 

爲什麼會拋出異常,我怎樣才能得到一個OntClass與URI tblURI資源?

感謝任何指針

回答

3

你不說什麼樣的模式m是。特別是,如果m是使用RDFS語言配置文件創建的,則OntModel將尋找rdfs:Classrdf:type,而不是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手動完成。

+0

正如我在我的問題的第一行中說的,m是一個常規模型,即不是一個OntModel。 m是否需要成爲一個OntModel才能獲得OntClass?如果是這樣,將模型轉換爲OntModel的最佳方式是什麼? – ec2011 2012-07-23 12:43:40

+0

關於前綴,是否可以提供一個前綴uri作爲m.createResource()的參數? – ec2011 2012-07-23 12:46:01

+0

在編輯的問題中查看您的問題的答案。 – 2012-07-23 14:01:50

相關問題