查询多个rdf文件

时间:2014-04-16 10:48:56

标签: rdf sparql jena

我正在使用jena API在我的java项目中编写sparql查询。

我有多个rdf文件,我需要编写查询,其中涉及显示属性的多个rdf文件的值。

对于单个rdf文件,我可以加载到模型中,创建查询字符串并执行它。

但是如何为多个rdf文档执行此操作。

注意:所有rdf文件都是本地存储的。

我的单个rdf文件的代码:

in = new FileInputStream(new File("data.rdf"));
model = ModelFactory.createOntologyModel();
model.read(in,defaultNameSpace);
in.close();

String queryString ="<My SParql Query>";

Query query = QueryFactory.create(queryString);

// Execute the query and obtain results
QueryExecution qe = QueryExecutionFactory.create(query, model);
ResultSet response = qe.execSelect();

// Output query results
ResultSetFormatter.out(System.out, response, query);

// Important - free up resources used running the query
qe.close();

如何使用多个rdf文件,我可以将它们加载到不同的模型中并仍在同一查询中使用吗?或者我应该加入模型来获得一个新模型,它们是它们的结合?

1 个答案:

答案 0 :(得分:1)

答案取决于您拥有的数据类型。 RDF文档表示每个文档中所有RDF语句/三元组的逻辑联合。如果文档的结合在逻辑上是一致的,那么将它们结合起来才有意义。

比如说,我有两个文件,A和B,其内容如下:

:a rdf:type foaf:Person .

..对于A,然后是......

:a rdf:type :Cat .

..代表B.这意味着联盟看起来像:

:a rdf:type foaf:Person .
:a rdf:type :Cat .

我们假设您的查询打算检索rdf:type的{​​{1}},并考虑每个方案。

如果您要分别查询这两个文档,那么您将拥有两个不同的:a,每个ResultSet一个QuerySolution。这两个解决方案可能在逻辑上与您的域一致,因为每个文档(在您的应用程序中)应该被视为一个完全独立的世界实例。

如果您要查询联合,那么您将只有一个ResultSet,其中包含两个QuerySolution s,这意味着:a a { {1}}和foaf:Person。例如,如果:Cat

,这可能违反了您的域逻辑限制

因此,问题会回到您的数据:可以将您的数据作为单个联合进行查询,还是需要将其作为单独的模型进行查询?

正如Joshua Taylor在他的评论中提到的,没有什么能阻止你制作一个foaf:Person owl:disjointWith :Cat循环,为你要查询的每个文档填充for。然后,您可以在查询每个文档时重用相同的Model对象。但是,您需要为每个实例单独添加Query个实例。同样,您可以创建一个QueryExecution,然后遍历所有文档名称并将其内容读入同一个实例(从而创建联合)。最后,您将通过统一模型执行查询。