- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要将从查询中获取的 Jena com.hp.hpl.jena.query.ResultSet
流式传输到转换为 RDF 输出格式的远程端点。我知道 Jena 为此提供了一个 ResultSetFormatter.toModel
工具,但是我有以下限制:
Model
并用 ResultSet
填充它,而是在迭代它时流出三元组,以控制内存消耗。我见过StreamRDF
接口(interface),但我不太清楚如何有效地使用它。在这种情况下,正确的方法是什么?
最佳答案
我实现的解决方案适合我,所以我将其发布为答案。下面的代码片段应该提供足够的信息,因为它涵盖了问题中的要求。值得注意的是,我创建了两个类,一个 ResultSetTripleIterator 和一个 QuerySolutionToTripleAdapter 接口(interface)。第一个负责将三元组流式传输给编写器,而第二个负责从每个 QuerySolution
构建三元组的迭代器。
public class ResultSetTripleIterator implements Iterator<Triple> {
private ResultSet rs;
private QuerySolutionToTripleAdapter ad;
private Iterator<Triple> it = null;
public ResultSetTripleIterator(ResultSet resultSet, QuerySolutionToTripleAdapter adapter) {
this.rs = resultSet;
this.ad = adapter;
}
@Override
public boolean hasNext() {
if(it != null && it.hasNext()){
return true;
}
it = null;
return rs.hasNext();
}
@Override
public Triple next() {
if(it == null){
it = ad.adapt(rs.next());
}
return it.next();
}
}
public interface QuerySolutionToTripleAdapter {
public Iterator<Triple> adapt(QuerySolution qs);
}
以下是应用程序示例:
// Can be any OutputStream
OutputStream os = new ByteArrayOutputStream();
StreamRDF stream = StreamRDFWriter.getWriterStream(os, Lang.TRIG);
QueryExecution qe = QueryExecutionFactory.sparqlService(
"http://data.open.ac.uk/sparql", "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> SELECT ?A ?B ?C WHERE {?A a ?B . ?A rdf:type ?C} LIMIT 100");
Iterator<Triple> iter = new ResultSetTripleIterator(qe.execSelect(), new QuerySolutionToTripleAdapter() {
Integer rowIndex = 0;
@Override
public Iterator<Triple> adapt(QuerySolution qs) {
rowIndex++;
String ns = "http://www.example.org/test/row#";
String pns = "http://www.example.org/test/col#";
Resource subject = ResourceFactory.createResource(ns + Integer.toString(rowIndex));
Property property;
List<Triple> list = new ArrayList<Triple>();
Iterator<String> cn = qs.varNames();
while (cn.hasNext()) {
String c = cn.next();
property = ResourceFactory.createProperty(pns + c);
list.add(new Triple(subject.asNode(), property.asNode(), qs.get(c).asNode()));
}
return list.iterator();
}
});
stream.start();
StreamOps.sendTriplesToStream(iter, stream);
stream.finish();
但是,Jena 似乎并不支持某些用于流式处理的 RDF 序列化,即 XML 和 JSON 格式,从而导致例如 org.apache.jena.riot.RiotException: No serialization for language Lang:rdf/null
。
编辑
感谢 Jena 用户邮件列表中的反馈,可以通过使用 Jena 的实用程序类来操作迭代器并执行转换来压缩上面的代码。
代码片段可以重写如下:
OutputStream os = new ByteArrayOutputStream();
StreamRDF stream = StreamRDFWriter.getWriterStream(os, Lang.RDFTHRIFT);
QueryExecution qe = QueryExecutionFactory.sparqlService(
"http://data.open.ac.uk/sparql", "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> SELECT ?A ?B ?C WHERE {?A a ?B . ?A rdf:type ?C} LIMIT 100");
Transform<QuerySolution, Iterator<Triple>> m = new Transform<QuerySolution, Iterator<Triple>>() {
Integer rowIndex = 0;
@Override
public Iterator<Triple> convert(QuerySolution qs) {
rowIndex++;
String ns = "http://www.example.org/test/row#";
String pns = "http://www.example.org/test/col#";
Resource subject = ResourceFactory.createResource(ns + Integer.toString(rowIndex));
Property property;
List<Triple> list = new ArrayList<Triple>();
Iterator<String> cn = qs.varNames();
while (cn.hasNext()) {
String c = cn.next();
property = ResourceFactory.createProperty(pns + c);
list.add(new Triple(subject.asNode(), property.asNode(), qs.get(c).asNode()));
}
return list.iterator();
}
};
Iterator<Triple> iter = WrappedIterator.createIteratorIterator( Iter.map( qe.execSelect(), m ));
stream.start();
StreamOps.sendTriplesToStream(iter, stream);
stream.finish();
关于java - 使用自定义词汇表将结果集流式传输为 RDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33136916/
来自 RDF Schema 1.1 2.4 rdfs:Datatype rdfs:Datatype is the class of datatypes. All instances of rdfs:D
我遇到了books ontology ,在 owl 的底部文档,我们有: A reservation has been made by a person for a boo
在 RDF/XML 文件中具有属性的订单是否重要?换句话说,以下两个相同吗? 1 2 2 1 最佳答案 是的,RDF 在数学上被定义为一组三元组,因此这些三元组在您使用
我刚开始学习 RDF,我的问题是: 空白节点的目的是什么? 例子: ex:John foaf:knows _:p1 _:p1 foaf:birthDate 04-21 这
让我们看看这个例子:http://dbpedia.org/page/Berlin “owl:sameAs”和“is owl:sameAs of”有什么区别 最佳答案 owl:sameAs 是一个对称属
许多数据集都有变化的历史。将历史数据作为关联数据提供可能是一个挑战。我正在考虑的一般情况是,数据集包含有关具有可以随时间变化的属性的事物的数据。一个例子可能是温莎城堡的历史:它过去有很多配置,但它仍然
我正在使用 MarkLogic 8.0-6.3 使用 sem:rdf-load 从 RDF 文件生成三元组时很少有三元组没有被创建。 我已经粘贴了 RDF 文件内容、生成的三元组和我用来加载文件的查询
在这里完成 RDF 新手,我正在努力理解如何创建合理且可重用的谓词。我问了我们公司的几位专家,但他们的谓词(被迫)通过复制对象是唯一的(例如 woman,has_a_bag,purse 与 woman
谁能给我一个 RDF 中具体化的简单例子?我想看看我是否理解正确。 例如,我提出以下案例 Tolkien -> wrote -> Lord of the rings /|\
我想对如下所示的合作伙伴关系进行建模,我以标记属性图的格式表示。 我想使用RDF语言来表达上面的图,特别是我想了解是否可以表达“loves”边的标签(这是一篇文章/信件的URI)。 我是RDF新手,我
我在构建 Project Gutenberg 目录的 SPARQL 查询时遇到困难(可在页面底部的 Gutenberg Feeds 获取)。我知道我对 SparQL/RDF 等如何工作缺乏了解。实际上
我正在用 RDF 创建一个 Material 集合。我遇到了两种处理度量单位的方法: 通过将描述性名称链接到 RDF 属性: prop:density prop:hasUnits "kg/m
RDF:Property 是否可以包含其他属性以及 rdf:range 和 rdf:domain。例如,您是否可以拥有以下内容: This is a member of
我对 RDF 和 RDF Schema (RDFS) 有点困惑。我读过一些文档,其中提到 rdfs 是为 RDF 定义词汇表。 根据这个定义,我可以说 RDFS 是像 OWL 或 Dublin Cor
rdf:resource、rdf:about 和 rdf:ID 之间在概念上有什么区别。我做了一些调查,但我还不清楚它们之间的区别。例如,第一次声明资源时是否使用rdf:ID,rdf:resource
这是rdf代码: 42 我需要得到号码 "42" .我试过这个: PREFIX soton: PREFIX skos: ?location skos:notation rdf:
关于语义网的初学者问题。 我有一个颜色知识库,其中包括相似的颜色、颜色修饰符(暗、亮、~ish 等)、颜色关系(更深、更亮)、颜色同义词等。我想弄清楚 RDF/OWL 是否是一个操作(主要是查询)这个
有什么办法可以加快 rdf 文件加载到 Sesame 中的速度吗?我有 N-triple 格式的文件,大小从几 MB 到几 GB。我已经尝试了 Sesame Cook Book 中的前三种方法,但无济
例如,这句话: "I give John a book." 使其成为一组三元组: I give John. John hasIndirect book. book count 1. 或者,它可以是:
在 RDF 图的 Turtle 序列化中,我有很多这样的三元组(很多个体,都有一个共同的类型值): :A a :b . :B a :b . :C a :b . :D a :b . # … :Z a :
我是一名优秀的程序员,十分优秀!