2

我在 Scala 中创建了一个 blazegraph 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);

但是,如果我尝试用我的cxnor替换repo预期的模型参数,Eclipse 会抱怨:

重载方法值写入替代方案: (x$1: Iterable[org.openrdf.model.Statement],x$2: java.io.Writer,x$3: org.openrdf.rio.RDFFormat)Unit (x$1: Iterable[org .openrdf.model.Statement],x$2: java.io.OutputStream,x$3: org.openrdf.rio.RDFFormat)单元不能应用于(com.bigdata.rdf.sail.BigdataSailRepository, java.io.FileOutputStream, org.openrdf.rio.RDF 格式)。

我如何从我必须的回购和连接中获得预期的模型Rio.write()?或者我可以用其他方式转储三元组吗?

4

3 回答 3

2

在这里http://docs.rdf4j.org/programming/第3.2.8点很好地描述了它。使用 RDF 处理程序

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-12T09:45:28.683 回答
2

实现此目的的另一种方法如下:

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)

使用exportover的优点getStatements是它还会将存储库中存在的任何命名空间声明写入文件。

与其他答案相比,这些方法中的任何一种的优点是您完全绕过了 SPARQL 查询解析器 - 因此对于大型存储库来说它更有效。

于 2017-05-13T01:04:21.850 回答
2

这个 Scala 代码对我有用。它完全基于 ChristophE 的回答。我已经建立了连接,但我确实需要创建一个文件输出流。我删除了 try 包装器,因为没有任何 catch 块。不建议生产!

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-12T13:01:15.940 回答