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