当前位置:Gxlcms > 数据库问题 > 导入本体到Jena TDB数据库

导入本体到Jena TDB数据库

时间:2021-07-01 10:21:17 帮助过:6人阅读

package cn.geodata.ont.tdb; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 import org.apache.commons.lang3.StringUtils; 8 import org.apache.jena.riot.RDFDataMgr; 9 import org.slf4j.Logger; 10 import org.slf4j.LoggerFactory; 11 12 import cn.geodata.ont.file.OntFile; 13 14 import com.hp.hpl.jena.ontology.OntModel; 15 import com.hp.hpl.jena.query.Dataset; 16 import com.hp.hpl.jena.query.ReadWrite; 17 import com.hp.hpl.jena.rdf.model.Model; 18 import com.hp.hpl.jena.rdf.model.ModelFactory; 19 import com.hp.hpl.jena.tdb.TDBFactory; 20 import com.hp.hpl.jena.tdb.base.file.Location; 21 22 /** 23 * @TODO TDB CRUD操作,包含事务 24 * @author Zhiwei HOU 25 * @date 2015年12月2日 26 */ 27 public class TDBPortal 28 { 29 final static Logger logger = LoggerFactory.getLogger(TDBPortal.class); 30 31 // 必须close 32 Dataset ds = null; 33 34 /** 35 * 连接TDB 36 * 37 * @param tdbPath TDB目录或配置文件tdb-assembler.ttl路径. tdbPath可以通过配置文件进行设置 38 * @param useAssemblerFile 是否使用配置文件连接 39 */ 40 public TDBPortal(String tdbPath, boolean useAssemblerFile) 41 { 42 if (!useAssemblerFile) 43 { 44 Location location = Location.create(tdbPath); 45 ds = TDBFactory.createDataset(location); 46 } 47 else 48 ds = TDBFactory.assembleDataset(tdbPath); 49 } 50 51 public TDBPortal(String tdbPath) 52 { 53 Location location = Location.create(tdbPath); 54 ds = TDBFactory.createDataset(location); 55 } 56 57 /** 58 * 往模型中添加内容。不载入引用本体 59 * 60 * @param modelUri 本体的uri 61 * @param sourcePath 本体文件实际地址 62 * @param override 是否覆盖 63 * @return 64 * @Houzw at 2016年4月1日下午11:36:13 65 */ 66 public int loadModel(String modelUri, String sourcePath, Boolean isOverride) 67 { 68 Model model = null; 69 ds.begin(ReadWrite.WRITE); 70 try 71 { 72 if (ds.containsNamedModel(modelUri)) 73 { 74 if (isOverride)// 覆盖 75 { 76 removeModel(modelUri);//只是移除地址,实际数据不会移除 77 loadModel(modelUri, sourcePath, false); 78 } 79 } 80 else 81 { 82 model = ds.getNamedModel(modelUri);// 没有则创建一个,model不会为null 83 model.begin(); 84 RDFDataMgr.read(model, sourcePath); 85 model.commit(); 86 } 87 // 已有,但是不覆盖,则直接返回 88 ds.commit(); 89 logger.info("本体模型数据已经导入"); 90 return 1; 91 } 92 catch (Exception e) 93 { 94 return 0; 95 } 96 finally 97 { 98 if (model != null) 99 model.close(); 100 ds.end(); 101 } 102 } 103 104 /** 105 * 导入本体。OntModel不支持事务。同时载入引用本体 106 * 107 * @param modelUri 模型uri 108 * @param sourcePath 本体文件(集成文件)地址 109 * @param override 是否覆盖 110 * @return 111 * @Houzw at 2016年4月1日下午11:36:09 112 */ 113 public int loadOntModel(String modelUri, String sourcePath, Boolean isOverride) 114 { 115 OntModel model = ModelFactory.createOntologyModel();// 不支持事务 116 ds.begin(ReadWrite.WRITE); 117 try 118 { 119 if (ds.containsNamedModel(modelUri)) 120 { 121 if (isOverride)// 覆盖 122 { 123 removeModel(modelUri); 124 loadOntModel(modelUri, sourcePath, false); 125 } 126 } 127 else 128 { 129 model = OntFile.loadOntModelWithLocMapper(sourcePath);//导入本体文件 130 ds.addNamedModel(modelUri, model); 131 132 } 133 // 已有,但是不覆盖,则直接返回 134 ds.commit(); 135 System.out.println(modelUri + " 已导入"); 136 logger.info(modelUri + " 已导入"); 137 return 1; 138 } 139 catch (Exception e) 140 { 141 System.out.println(e.getLocalizedMessage()); 142 logger.error(e.getLocalizedMessage()); 143 return 0; 144 } 145 finally 146 { 147 ds.end(); 148 } 149 } 150 151 152 public Model getDefaultModel() 153 { 154 ds.begin(ReadWrite.READ); 155 Model model; 156 try 157 { 158 model = ds.getDefaultModel(); 159 ds.commit(); 160 } 161 finally 162 { 163 ds.end(); 164 } 165 return model; 166 } 167 168 /** 169 * 获取指定模型 170 */ 171 public Model getModel(String modelUri) 172 { 173 Model model = null; 174 ds.begin(ReadWrite.READ); 175 try 176 { 177 model = ds.getNamedModel(modelUri); 178 } 179 finally 180 { 181 ds.end(); 182 } 183 return model; 184 } 185 186 187 public void loadDefaultModel(String sourcePath) 188 { 189 Model model = null; 190 ds.begin(ReadWrite.WRITE); 191 try 192 { 193 model = ds.getDefaultModel(); 194 model.begin(); 195 if (!StringUtils.isBlank(sourcePath)) 196 RDFDataMgr.read(model, sourcePath); 197 model.commit(); 198 ds.commit(); 199 } 200 finally 201 { 202 if (model != null) 203 model.close(); 204 ds.end(); 205 } 206 } 207 208 209 public void removeModel(String modelUri) 210 { 211 if (!ds.isInTransaction()) 212 ds.begin(ReadWrite.WRITE); 213 try 214 { 215 ds.removeNamedModel(modelUri); 216 ds.commit(); 217 System.out.println(modelUri + " 已被移除"); 218 logger.info(modelUri + " 已被移除"); 219 } 220 finally 221 { 222 ds.end(); 223 } 224 } 225 226 /** 227 * 列出所有模型的uri 228 */ 229 public List<String> listModels() 230 { 231 ds.begin(ReadWrite.READ); 232 List<String> uriList = new ArrayList<>(); 233 try 234 { 235 Iterator<String> names = ds.listNames();// DefaultModel没有name 236 String name = null; 237 while (names.hasNext()) 238 { 239 name = names.next(); 240 uriList.add(name); 241 } 242 } 243 finally 244 { 245 ds.end(); 246 } 247 return uriList; 248 } 249 250 /** 251 * 必须关闭TDB连接 252 */ 253 254 public void close() 255 { 256 ds.close(); 257 } 258 }

 以上简单介绍了基于Jena TDB的本体存储。目前我对AssemblerFile配置文件的配置还没有深入的研究,了解的朋友可以告诉我,O(∩_∩)O谢谢

 

水平有限,错误难免,多指教。TDB 的具体内容可查阅其官方文档



[1] http://ontotext.com/products/graphdb/

[2] http://www.openlinksw.com/

[3] http://franz.com/

导入本体到Jena TDB数据库

标签:

人气教程排行