使用jena開發本體應用程序時,首先需要對我們利用本體構建工具,如protege等,構建的本體文件,如owl、rdf等讀取並解析得到本體模型。下面給出相應的代碼,不對的地方請指正。
(基於jena 2.13.0,jena 3 需要java 1.8)
方式一:使用RDFDataMgr
/** * 使用RDFDataMgr讀取RDF文件 * * @param fileName URI或 file:filename形式路徑 * @return */ public static OntModel openRDFFile(String fileName) { OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); RDFDataMgr.read(model, fileName); return model; }
方式二:使用FileManager
/** * 打開並讀取RDF文件 * * @param fileName * @return */public static OntModel openRdfFile(String fileName) { OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); InputStream in = FileManager.get().open(fileName); OntModel baseOntModel = null; if (in != null) { baseOntModel = (OntModel) model.read(in, ""); } return baseOntModel; }
上面兩種方式都沒有處理本體導入(import)問題,也即不能同時讀取你在構建本體時引入的其他本體文件。為了處理引用的本體,本人目前發現最好的方式是使用配置文件:location-mapping.ttl
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix lm: <http://jena.hpl.hp.com/2004/08/location-mapping#> . # 地址映射 # Application location to alternative location mappings. # + name 指本體本體文件的uri。可以是http開頭的url,也可以是file:開頭的文件地址。引入文件中的name一般是uri # + altName 指文件實際的地址,可以是file:開頭的本地文件,或網絡地址 # + 順序無關. # # The translation algorithm is: # # 1 - Exact mappings: these are tried before attempting a prefix match. # 2 - By prefix: find the longest matching prefix # 3 - Use the original if no alternative. [] lm:mapping [ lm:prefix "GTS" ; lm:altPrefix "http://www.geodataont.cn/support/geology/gts" ], [ lm:name "http://www.geodataont.cn/support/geology/gts" ; lm:altName "file:*/GTS.owl" # 請將*替換為文件目錄 ]
注:prefix部分我暫時沒明白啥意思,不一定是對的
prefix部分補充:當利用
lm:altName 找不到對應文件時,會查找與lm:name匹配的最長的lm:prefix,利用其lm:altPrefix和lm:altName組合到一起最為地址去查找文件。
若有:
lm:name "http://www.geodataont.cn/support/geology/gts/a.owl" ;
lm:altName "file:*/a.owl"
則可以配置為:
lm:prefix "http://www.geodataont.cn/support/geology/gts" ;
lm:altPrefix "file:*/"
lm:name "http://www.geodataont.cn/support/geology/gts/a.owl" ;
lm:altName "a.owl"
(2016-04-09)
-------------------------------
補充(2017-05-08):Jena中處理prefix的部分代碼存在bug,本人已在在stackoverflow指出: http://stackoverflow.com/questions/43680583/how-to-use-prefix-and-altprefix-in-location-mapping-ttl-to-load-owl-file
因此,目前此部分尚不能使用
-------------------------------
相應的代碼如下
/** * 讀取本體,使用location-mapper確定引用文件地址 * * @param locMapperPath * @param baseOntPath 讀取的本體文件路徑 * @return */ public static OntModel loadOntModelWithLocMapper(String locMapperPath, String baseOntPath) { OntModel model = ModelFactory.createOntologyModel(); LocationMapper locMapper = readLocationMapper(locMapperPath); model.getDocumentManager().setProcessImports(true); FileManager fileManager = model.getDocumentManager().getFileManager(); fileManager.setLocationMapper(locMapper); baseOntPath = StringUtil.getUriFilePath(baseOntPath);// 添加file:,替換\ fileManager.readModel(model, baseOntPath); model.loadImports(); return model; }
其中getUriFilePath是將文件地址進行轉換,方便讀取
public static String getUriFilePath(String filepath) { if (filepath.startsWith("file:") || filepath.startsWith("http://")) { return filepath; } else { filepath = "file:" + filepath; filepath = filepath.replaceAll("\\\\", "/"); return filepath; } }
目前基本功能就是這樣,詳細內容參考jena的文檔。不對的地方一起討論