导入本体到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数据库
标签: