2017-05-11 43 views
2

created a blazegraph RDF4J repository and connection在斯卡拉:如何将嵌入式Blazegraph内容转储到RDF文件?

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文件,like this

Rio.write(model, System.out, RDFFormat.RDFXML); 

但是,如果我试图取代我的cxnrepo的预期模型参数,Eclipse的抱怨:

重载方法值写入与选择:(X $ 1: 可迭代[org.openrdf.model.Statement],X $ 2:java.io.Writer中,X $ 3: org.openrdf.rio.RDFFormat)单位(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.RDFFormat)。

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

+0

'cxn'只是一个连接,不是吗?你应该怎么看待这个应该被抛弃?有关所有写入方法,请参阅http://docs.rdf4j.org/javadoc/latest/org/eclipse/rdf4j/rio/Rio.html我无法看到将整个存储库转储到文件的任何内容。至少不适合RIO班。 – AKSW

+0

是的,我猜倾销连接是一个巨大的冲击。不过,我希望有一些存储库。感谢您的检查。我还从com.bigdata导入了一些Blazegraph的方法。我想我会在那里看看。 –

+0

也许有一些CLI工具如对于MySQL?您绝对应该在邮件列表上询问Blazegraph的支持。我很确定他们可以帮助你 – AKSW

回答

2

这里相当好的描述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写入文件。

1

这个Scala代码适合我。这完全基于ChristophE的回答。我已经有一个连接,但我确实需要创建一个文件输出流。由于没有任何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) 
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) 

使用export超过getStatements的优点是,它也将写现有档案库文件的任何命名空间声明。

这些方法相对于其他答案的优点是您完全绕过了SPARQL查询解析器 - 因此它对于大型回购更有效。

+0

谢谢,这真是这个问题的意图。在我的手中,'cxn.export(writer)'执行转储,但没有前缀(namespace?)定义。对于'cxn.getStatements(null,null,null)',我得到'方法getStatements的参数不够:(x $ 1:org.openrdf.model.Resource,x $ 2:org.openrdf.model.URI,x $ 3: org.openrdf.model.Value,x $ 4:Boolean,x $ 5:org.openrdf.model.Resource *)org.openrdf.repository.RepositoryResult [org.openrdf.model.Statement]。未指定的值参数x $ 4,x $ 5.'我正在使用 –

+0

我的build.sbt请求'“com.blazegraph”%“bigdata-core”%“2.1.4”',这是拉芝麻 - * - 2.7.12 .jar,___不是RDF4J 2.2.1 .___ –

+0

这听起来像是一个Blazegraph分布问题。我会直接与他们联系。 –

相关问题