我在Scala中有创建了一个囊胚图RDF4J存储库和连接:
val props = new Properties()
props.put(Options.BUFFER_MODE, BufferMode.DiskRW)
props.put(Options.FILE, "embedded.jnl")
var sail = new BigdataSail(props)
var repo = new BigdataSailRepository(sail)
repo.initialize()
var cxn = repo.getConnection()
我可以添加语句,检索SPARQL结果等。
现在,我想将存储库的内容转储到RDF文件像这样中。
Rio.write(model, System.out, RDFFormat.RDFXML);
但是,如果我试图将我的cxn
或repo
替换为预期的模型参数,Eclipse会抱怨:
重载的方法值写入选项:(x$1: Iterableorg.openrdf.model.Statement,x$2: java.io.Writer,x$3: org.openrdf.rio.RDFFormat)Unit (x$1: Iterableorg.openrdf.model.Statement,x$2: java.io.OutputStream,x$3: org.openrdf.rio.RDFFormat)Unit不能应用(com.bigdata.rdf.sail.BigdataSailRepository,java.io.FileOutputStream,org.openrdf.rio.RDFFormat)。
如何从回购和连接中获得我必须与Rio.write()
预期的模型的连接?或者我可以用其他方式把三元组扔掉吗?
发布于 2017-05-12 01:45:28
这里很好地描述了http://docs.rdf4j.org/programming/点3.2.8。使用RDFHandlers
import org.eclipse.rdf4j.rio.Rio;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.RDFWriter;
try (RepositoryConnection conn = repo.getConnection()) {
RDFWriter writer = Rio.createWriter(RDFFormat.TURTLE, System.out);
conn.prepareGraphQuery(QueryLanguage.SPARQL,
"CONSTRUCT {?s ?p ?o } WHERE {?s ?p ?o } ").evaluate(writer);
}
而不是将System.out写到文件中。
发布于 2017-05-12 05:01:15
这个Scala代码对我有用。这完全是基于克里斯多夫的回答。我已经有了一个连接,但是我确实需要创建一个文件输出流。由于没有catch块,我删除了try包装器。不推荐生产!
var out = new FileOutputStream("rdf.ttl")
var writer = Rio.createWriter(RDFFormat.TURTLE, out)
cxn.prepareGraphQuery(QueryLanguage.SPARQL,
"CONSTRUCT {?s ?p ?o } WHERE {?s ?p ?o } ").evaluate(writer)
发布于 2017-05-12 17:04:21
另一种实现这一目标的方法如下:
var out = new FileOutputStream("rdf.ttl")
Rio.write(cxn.getStatements(null,null,null), out, RDFFormat.TURTLE)
这是因为getStatements
的输出是一个RepositoryResult
对象,它继承自Iteration<Statement>
,因此可以直接输入RDFHandler
。
您也可以这样做:
var writer = Rio.createWriter(RDFFormat.TURTLE, out)
cxn.export(writer)
使用export
而不是getStatements
的优点是它还会将存储库中存在的任何名称空间声明写入文件。
与其他方法相比,这两种方法的优点是可以完全绕过SPARQL查询解析器--因此对于大型repos来说,效率更高。
https://stackoverflow.com/questions/43920947
复制相似问题