Pure-SPARQL从一个端点到另一个端点的数据迁移?

时间:2017-06-14 17:21:49

标签: sparql rdf

看起来this question之前已被提出,但后来被删除了?!

对于一个SQL表格中的数据,我可以轻松replicate the structure然后migrate the data to another table (or database?)

CREATE TABLE new_table
  AS (SELECT * FROM old_table);

SELECT *
INTO new_table [IN externaldb]
FROM old_table
WHERE condition; 

是否有类似于RDF / SPARQL的东西?是否将select和insert组合到一个SPARQL语句中?

具体来说,我使用Karma,它将数据发布到嵌入式OpenRDF / Sesame端点。 GUI的端点上有一个文本框,因此我可以将其更改为独立的RDF4J,因为RDF4J是芝麻的一个分支。

不幸的是,当我在端点文本框中输入Virtuoso,Stardog或Blazegraph端点的地址时,我从Karma收到类似invalid SPARQL endpoint的错误。我怀疑它可能 可能 来修改和重新编译Karma,或者(更现实地),我可以用Jena或RDF4J库编写一个小工具来select进入RAM或暂存磁盘空间,然后insert进入另一个端点。

但如果有纯SPARQL解决方案,我肯定希望听到它。

1 个答案:

答案 0 :(得分:1)

在SPARQL中,您只能指定端点。因此,部分纯SPARQL解决方案是在目标 triplestore上运行以下更新:

INSERT { ?s ?p ?o } 
WHERE { SERVICE <http://source/sparql> 
        { 
           ?s ?p ?o
        }
}

这会将所有三元组从(远程)源的默认图形复制到目标商店,但不会复制任何已命名的图形。要复制任何已命名的图形,您还可以执行此操作:

INSERT { GRAPH ?g { ?s ?p ?o } } 
WHERE { SERVICE <http://source/sparql> 
        { 
          GRAPH ?g {
           ?s ?p ?o
          }
        }
}

如果你没有挂在纯SPARQL上,不同的工具包和框架为你提供了各种选择。例如,使用RDF4J的Repository API,您可以将源和目标都包装在SPARQLRepository代理中(如果其中一个是实际的RDF4J存储,则只使用HTTPRepository),然后运行复制API操作。有很多不同的方法,一种可能的方法(免责声明:我没有测试这段代码片段)是这样的:

  SPARQLRepository source = new SPARQLRepository("http://source/sparql");
  source.initialize();
  SPARQLRepository target = new SPARQLRepository("http://target/sparql");
  target.initialize();

  try (RepositoryConnection sourceConn = source.getConnection(); 
       RepositoryConnection targetConn = target.getConnection()) {
     sourceConn.export(new RDFInserter(targetConn)); 
  }