我在Scala中有created a blazegraph RDF4J repository and connection:
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);
但是如果我尝试用我的cxn
或repo
替换预期的模型参数,Eclipse会抱怨:
重载方法值写入替代方法:(x $ 1: Iterable [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 :(得分: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查询解析器 - 因此对于大型回购更有效。
答案 1 :(得分:1)
这个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)