2017-05-11 2 views
2

私はScalaで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

私が期待されるモデル引数のための私の cxnまたは repoを代用しようとした場合
Rio.write(model, System.out, RDFFormat.RDFXML); 

しかし、Eclipseは文句:

代替と

オーバーロードメソッド値書き込み:(X $ 1: のIterable [org.openrdf.model.Statement]、$ 2×:、のjava.io.WriterをX $ 3: org.openrdf.rio.RDFFormat)ユニット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

ええ、私は接続をダンプするのはロングショットだったと思います。私はリポジトリのために何かがあることを望んでいた。確認してくれてありがとう。また、blazegraphのメソッドのいくつかをcom.bigdataからインポートしています。私は次にそこを見るだろうと思う。 –

+0

おそらく、CLIツールなどがあります。 MySQLのために?あなたは間違いなく、メーリングリストのBlazegraphのサポートに頼むべきです。私は彼らがあなたを助けることができると確信しています – AKSW

答えて

2

非常にうまくここに記載されていますhttp://docs.rdf4j.org/programming/ポイント3.2.8。 RDFHandlerの使用

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の答えに基づいています。私はすでに接続していましたが、ファイル出力ストリームを作成する必要がありました。キャッチブロックがないので、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の出力はIteration<Statement>から継承RepositoryResultオブジェクトであり、そのように直接供給することができるので、これは動作しますRDFHandlerに入力します。

また、これを行うことができます。

var writer = Rio.createWriter(RDFFormat.TURTLE, out) 
cxn.export(writer) 

getStatementsexportを使用する利点は、それがまた、ファイルへのリポジトリ内の既存のすべての名前空間宣言を記述することです。

これらのアプローチのいずれかの利点は、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:ブール値、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 "'を呼びます。 .jar、___not RDF4J 2.2.1 .___ –

+0

これは、Blazegraphの配布の問題のようです。私はこれについて直接彼らに連絡したいと思います。 –

関連する問題