【发布时间】:2014-10-07 11:00:45
【问题描述】:
我有一个带有一些类的本体,并且所有设置都可以运行。用个人和数据填充它的好方法是什么?简而言之,从数据库(作为输入)到本体的单向映射。
public class Main {
static String SOURCE = "http://www.umingo.de/ontology/bento.owl";
static String NS = SOURCE+"#";
public static void main(String[] args) throws Exception {
OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );
// read the RDF/XML file
model.read(SOURCE);
OntologyPreLoader loader = new OntologyPreLoader();
model = loader.init(model);
model.write(System.out,"RDF/XML");
}
}
我的预加载器有一个方法 init,其目标是将数据从数据库复制到本体中。这是摘录。
public OntModel init(OntModel model) throws SQLException{
Resource r = model.getResource( Main.NS + "Tag" );
Property tag_name = model.createProperty(Main.NS + "Tag_Name");
OntClass tag = r.as( OntClass.class );
// statements allow to issue SQL queries to the database
statement = connect.createStatement();
// resultSet gets the result of the SQL query
resultSet = statement
.executeQuery("select * from niuu.tags");
// resultSet is initialised before the first data set
while (resultSet.next()) {
// it is possible to get the columns via name
// also possible to get the columns via the column number
// which starts at 1
// e.g., resultSet.getSTring(2);
String id = resultSet.getString("id");
String name = resultSet.getString("name");
Individual tag_tmp = tag.createIndividual(Main.NS+"Tag_"+id);
tag_tmp.addProperty(tag_name,name);
System.out.println("id: " + id);
System.out.println("name: " + name);
}
return model;
}
一切正常,但我真的不确定这种预加载本体的方式。此外,每个人都应该获得自己的 ID,以便我以后可以将其与数据库匹配。 我可以简单地定义一个属性 ID 并将其添加到每个个人吗?
我考虑将 ID 添加到“事物”,因为它是 OWL 本体中最基本的类型。
【问题讨论】:
-
顺便说一句,您是否尝试过映射您的数据,然后将三元组存储在三元组存储中?那么你就不需要你的原始数据库了。为此,您可以使用 Jena TDB。
-
我已经使用了一些数据库,并且已经需要一个 3.4 GB 的 Java 堆空间。我不认为我会将本体三元组存储为文件。但感谢您的建议
-
请注意,TDB 使用内存映射文件 IO 并智能分页其索引。对于原本可以存储在内存中的小型数据集,TDB 速度较慢,但是当数据集变得太大而无法存储在内存中时,它会继续运行。我只用 4 GB 内存就运行了多达 2700 万个三元组。然而,TDB 的索引需要
lot的磁盘空间。
标签: java mysql jena ontology preloading