看起来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解决方案,我肯定希望听到它。
答案 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));
}