我正在使用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文件,我可以将它们加载到不同的模型中并仍在同一查询中使用吗?或者我应该加入模型来获得一个新模型,它们是它们的结合?
答案 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
,然后遍历所有文档名称并将其内容读入同一个实例(从而创建联合)。最后,您将通过统一模型执行查询。