【问题标题】:query over multiple rdf files查询多个 rdf 文件
【发布时间】:2014-04-16 10:48:55
【问题描述】:

我正在使用 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 文件,我可以将它们加载到不同的模型中并仍然在同一个查询中使用吗?或者我应该加入模型以获得它们的联合的新模型?

【问题讨论】:

  • 不清楚你在问什么。您说“我可以将它们加载到不同的模型中并仍然在同一个查询中使用吗?”。当然,只需创建一个不同的模型,读取不同的文件,然后其余代码相同。如果您想要一个包含所有文件中的三元组的模型,您可以创建一个模型,然后使用model.read 将每个文件读入模型。或者,正如您所说,您可以创建一个联合模型。

标签: rdf sparql jena


【解决方案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 .

假设您的查询打算为:a 检索rdf:type,并考虑每种情况。

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

如果您要查询联合,那么您将有一个 ResultSet 和两个 QuerySolutions,这意味着 :aboth 一个 foaf:Person 和一个 @987654335 @。这可能违反了您的域逻辑约束,例如,foaf:Person @987654323@ :Cat

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多