2017-05-11 61 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分佈問題。我會直接與他們聯繫。 –

相關問題