2017-06-14 55 views
1

它看起來像this question已經被提出過,但隨後被刪除?!Pure-SPARQL從一個端點到另一個端點的數據遷移?

對於一個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這樣的錯誤。我懷疑這可能是可能修改和重新編譯噶,或(更真實),我可以寫耶拿或RDF4J庫一個小工具,select到RAM或刮傷磁盤空間,然後insert到另一個端點。

但是,如果有純SPARQL解決方案,我一定會喜歡聽到它。

+0

我很好奇,如果你已經嘗試這樣那樣的辦法,它就是你」重新找? https://stackoverflow.com/questions/10078966/multiple-sparql-insert-where-queries-in-a-single-request如果不是,也許至少它可能會讓你朝着正確的方向 –

+0

從技術上講,INSERT { ?s?p?o。 }在哪裏{?s?p?o。 };'這樣的查詢應該選擇數據庫中每一個可能的三元組('WHERE'子句),插入應該創建它們。這是對你的問題的回答'將select和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代理中(或者只要使用HTTPRepository,如果其中一個是實際的RDF4J存儲),然後只運行復制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)); 
    } 
+1

太好了。在Fuseki中,默認圖形插入對我有用。我會在今天晚些時候與我的其他商店,以及指定的圖形插入和RDF4J代碼段一起嘗試。 –

相關問題