Как вывести дамп встроенного содержимого Blazegraph в файл RDF?

Я создал Blazegraph RDF4J репозиторий и соединение в Scala:

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);

Но если я попытаюсь заменить мой 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()? Или я могу бросить тройки другим способом?

3 ответа

Решение

Это довольно хорошо описано здесь http://docs.rdf4j.org/programming/ point 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 пишите в файл.

Этот код Scala работал для меня. Это полностью основано на ответе Кристофа. У меня уже было соединение, но мне нужно было создать поток вывода файла. Я удалил упаковку 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)

Еще один способ добиться этого заключается в следующем:

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, поэтому он более эффективен для больших репозиториев.

Другие вопросы по тегам