【问题标题】:How can I dump embedded Blazegraph contents to an RDF file?如何将嵌入的 Blazegraph 内容转储到 RDF 文件?
【发布时间】:2017-05-11 16:24:45
【问题描述】:

我在 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: 可迭代[org.openrdf.model.Statement],x$2: java.io.Writer,x$3: org.openrdf.rio.RDFFormat)单位 (x$1: 可迭代[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)。

如何从我所拥有的 repo 和连接中获得Rio.write() 期望的模型?或者我可以用其他方式转储三元组吗?

【问题讨论】:

  • cxn 只是一个连接,不是吗?你认为这应该如何被丢弃?有关所有写入方法,请参阅docs.rdf4j.org/javadoc/latest/org/eclipse/rdf4j/rio/Rio.html 我看不到任何将整个存储库转储到文件的内容。至少在 RIO 类中没有。
  • 是的,我猜想转储连接是一个远景。不过,我希望存储库有一些东西。感谢您的检查。我还从 com.bigdata 导入了一些 Blazegraph 的方法。我想我接下来会去那里看看。
  • 也许有一些 CLI 工具,例如对于 MySQL?您绝对应该在邮件列表中询问 Blazegraph 支持。我很确定他们可以帮助你

标签: scala sparql rdf blazegraph rdf4j


【解决方案1】:

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 写入文件。

【讨论】:

    【解决方案2】:

    这个 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)
    

    【讨论】:

      【解决方案3】:

      实现此目的的另一种方法如下:

      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 查询解析器 - 因此它对于大型存储库更有效。

      【讨论】:

      • 谢谢,这确实是问题的意图。在我手中,cxn.export(writer) 执行转储,但没有前缀(命名空间?)定义。对于cxn.getStatements(null,null,null),我得到not enough arguments for method 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]. Unspecified value parameters x$4, x$5. 我正在使用
      • 我的 build.sbt 请求 "com.blazegraph" % "bigdata-core" % "2.1.4",这是在拉 sesame-*-2.7.12.jar,不是 RDF4J 2.2.1。
      • 这听起来像是 Blazegraph 分发问题。我会直接联系他们。
      • @MarkMiller 关于第二个错误(没有足够的参数),这可能是因为 getStatements 方法中的 includeInferred 参数仅在更新的 RDF4J 版本中被设为可选。你可以试试getStatements(null,null,null,true)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多