sparql - 在 Jena 中选择 FROM 子句不返回任何结果
问题描述
我们无法使用 Jena 数据集中的 sparql FROM 子句跨多个图可靠地发出 sparql 查询。
这是该问题的一个示例:
final String subject = "http://example.com/ont/breakfast#espresso";
final String graph1 = "http://example.com/ont/breakfast/graph#espresso_definition";
final String graph2 = "http://example.com/ont/breakfast/graph#espresso_decoration";
// Add some triples to graphs within the dataset
Dataset dataset = DatasetFactory.create();
Model modelG1 = dataset.getNamedModel(graph1);
Resource espressoTypeG1 = modelG1.createResource(subject)
.addProperty(RDF.type, OWL.Class);
Resource espressoLabelG1 = modelG1.createResource(subject)
.addProperty(RDFS.label, "Espresso");
Model modelG2 = dataset.getNamedModel(graph2);
Resource espressoLabelG2 = modelG2.createResource(subject)
.addProperty(RDFS.label, "Black Gold");
// The query to execute - returns no results
String queryString = "select * FROM <" + graph1 + "> FROM <" + graph2 + "> " +
"{ <" + subject + "> ?p ?o }";
// This, however, works:
// String queryString = "select * { graph ?g { <" + subject + "> ?p ?o } }";
// Run the query
Query query = QueryFactory.create(queryString);
try (QueryExecution qe = QueryExecutionFactory.create(query, dataset)) {
ResultSet results = qe.execSelect();
while (results.hasNext()) {
QuerySolution result = results.next();
System.out.println(result);
}
}
values子句和graph关键字的组合帮助我们完成了大多数需要在同一查询中处理多个图的场景。在某些查询中,这变得非常笨拙或效率低下。
我们可以做些什么来正确地在单个数据集中的模型联合中发出查询?
请注意,查询在编译时是未知的,因此我们不能依赖在 Java 代码中手动创建模型的联合。此外,通常使用从文件加载、sparql 更新和调用dataset.asDatasetGraph().add(...)的组合来添加数据。
解决方案
处理FROM
和FROM NAMED
取决于使用的Dataset
实现是否支持它,默认的内存实现默认不支持它。
要强制使用数据集,您可以使用DynamicDatasets
和DatasetDescription
帮助类来解析查询指定的数据集,例如
Dataset resolvedDataset =
DynamicDatasets.dynamicDataset(DatasetDescription.create(query), dataset, false);
try (QueryExecution qe = QueryExecutionFactory.create(query, resolvedDataset)) {
// Normal result processing logic goes here...
}
推荐阅读
- ios - 隐藏导航栏但保留后退按钮 - SwiftUI
- javascript - 如何从 url 中删除 # 并在没有 # 的情况下使用 Javascript
- reactjs - 同一文件中的多个 Axios 调用
- django - 在 django 中创建表单的最佳方法
- java - 将列表插入 sql 查询(IN 子句)
- aggregate - 如何将 describeBy 与两个组一起使用?
- xml - 通过 Xpath 查询提取 N 个值
- gradle - Gradle:仅忽略指定任务的失败?
- mapstruct - 使用 Mapstruct 映射嵌套列表是不可能的 - 在测试期间它返回 list = null
- ios - Flutter:iOS 上的 Google 地图在 Singlechildscrollview 中的行为不符合预期