jena讀取和解析本體文件


使用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的文檔。不對的地方一起討論


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM