我有一个本体论与一些类和所有设置运行。用个人和数据填充它的好方法是什么?简而言之,执行从数据库(作为输入)到本体的单向映射。
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添加到"Thing“中,因为它是OWL本体中最基本的类型。
发布于 2014-10-07 21:47:39
乍一看,这似乎还可以。一个技巧是尝试将Jena模型转换为RDF序列化,并通过Protégé运行它,以便更清楚地了解您的本体映射是什么样子。
您绝对可以创建自己的属性来描述每个人的id。下面是一个示例,说明如何以turtle格式创建类似的属性。(我没有添加OWL和rdfs的前缀,因为它们很常见)如果需要,也可以在Jena中添加。(或者将其加载到Jena中的模型中。)
@prefix you: <your domain> .
you:dbIdentificator a owl:DatatypeProperty .
you:dbIdentificator rdfs:label "<Your database identifcator>"@en .
you:dbIdentificator rdfs:comment "<Some valuable information if needed>"@en .
you:dbIdentificator rdfs:isDefinedBy <your domain> .
you:dbIdentificator rdfs:domain owl:Thing .您还可以将owl:Thing添加到每个资源,但这不是最佳实践,因为它是资源的模糊定义。我会四处寻找定义资源是什么的词汇表。看看GoodRelations吧。它是一个非常好定义的词汇表,可以描述信息,即使它不是用于商业用途。尤其是查看那里的类。
希望这回答了你的一些问题。
发布于 2014-10-07 22:02:12
以编程方式生成URI总是有些令人不安。如果您有Guava,那么可以使用Preconditions对数据库中的内容做出一些快速失败的断言(这样,如果代码与您的模式不一致,就会让您知道)。使用JDK来确保从数据库获得的URLEncoder被转换成URI友好的格式(请注意,如果您的数据包含不能用id打印的字符,并且没有百分号编码,则需要手动处理它们)。
对于属性/列值,请使用显式创建文字。这清楚地表明您使用的是纯文字、语言文字还是类型文字:
// If things can have multiple names in multiple languages, for example
tag_tmp.addProperty(tag_name,model.createTypedLiteral(name, "en"));请注意,您可能不希望定义您的模式,使其隐含有关owl:Thing的内容,因为这将在您的域之外产生影响。相反,应该定义一个特定于域的概念,比如:DatabaseResource。将属性域设置为该属性域,它是子类而不是事物。这样,使用您的属性意味着主题与您的域中的owl个体,而不是简单的owl个体(不管怎样,由owl:DatatypeProperty的域暗示)。
RDF :创建数据库惟一ID的表示并将其放入模型中是完全可以接受的。如果您使用的是owl2,则可以在该属性上为:DatabaseResource定义一个OWL-2 Key,并保留与数据库中相同的语义。
编辑:在Jena邮件列表中记录您的帖子的一部分:
我有一个巨大的MYSQL数据库,只读的目的,并想提取一些数据到本体论。
我强烈建议使用TDB Java API来构建一个由您的磁盘支持的Dataset。我以前处理过非常大的数据库导出,否则您的数据大小很可能不容易处理。TDB的索引需要大量的磁盘空间,但是由于OOM错误,内存映射的IO使得终止操作非常困难。最后,一旦在磁盘上构建了数据库,就不必再次执行这个代价高昂的导入操作(或者至少可以对其进行优化)。
如果您发现创建数据库的时间太长,那么您可以创造性地使用批量加载器。This answer有一个使用java的批量加载器的例子。
https://stackoverflow.com/questions/26234485
复制相似问题