2017-06-14 1 views
1

Il semble que this question a été soulevé avant, mais supprimé par la suite ?! Pour les données dans une table SQL, je peux facilement replicate the structure puis migrate the data to another table (or database?).Migration de données Pure-SPARQL d'un point de terminaison vers un autre?

CREATE TABLE new_table 
    AS (SELECT * FROM old_table); 

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

Existe-t-il quelque chose d'analogue pour RDF/SPARQL? Quelque chose qui combine un select et un insert dans une instruction SPARQL? En particulier, j'utilise Karma, qui publie des données sur un point de terminaison OpenRDF/Sésame intégré. Il y a une zone de texte sur l'interface graphique pour le point de terminaison, donc je peux le changer en un RDF4J autonome, puisque RDF4J est une branche de Sésame.

Malheureusement, j'obtiens une erreur comme invalid SPARQL endpoint de Karma lorsque je mets l'adresse pour un point de terminaison Virtuoso, Stardog ou Blazegraph dans la zone de texte du point de terminaison. Je pense qu'il pourrait être possible à modifier et recompiler Karma, ou (plus réaliste), je pourrais écrire un petit outil avec le Jena ou les bibliothèques RDF4J à select en RAM ou d'espace disque scratch puis insert dans l'autre extrémité.

Mais s'il y a une solution pure-SPARQL, j'aimerais bien l'entendre.

+0

Je suis curieux de savoir si vous avez essayé ce genre d'approche et c'est ce que vous » re cherche? https://stackoverflow.com/questions/10078966/multiple-sparql-insert-where-queries-in-a-single-request sinon, peut-être au moins cela pourrait-il vous aider à aller dans la bonne direction –

+0

Techniquement, 'INSERT { ? s? p? o. } O WH {? S? P? O. }; 'une telle requête devrait sélectionner tous les triples possibles dans la base de données (clause WHERE) et insérer devrait les créer. Ceci est la réponse à votre question 'Quelque chose qui combine un select et un insert dans une déclaration SPARQL?' Mais je suppose que vous voulez faire des choses plus complexes juste que cela. –

+0

génial, pouvez-vous montrer comment je spécifie les points de terminaison de la source et de la destination? –

Répondre

1

Dans SPARQL, vous ne pouvez spécifier que le point de terminaison source. Par conséquent, une solution pure SPARQL partielle serait de lancer la mise à jour suivante sur votre cible triplestore:

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

Cette copie sur tous les triplets de la valeur par défaut de la source (à distance) graphique pour votre magasin cible, mais ne copie sur aucun graphique nommé. Pour copier les graphes nommés ainsi, vous pouvez exécuter ceci en plus:

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

Si vous n'êtes pas accroché sur SPARQL pur bien, boîtes à outils et des cadres différents, vous offrent toutes sortes d'options. Par exemple, en utilisant Repository API de RDF4J, vous pouvez simplement envelopper la source et la cible dans un proxy SPARQLRepository (ou simplement utiliser un HTTPRepository si l'un est un magasin RDF4J réel), puis exécuter des opérations d'API de copie. Il y a plusieurs façons de le faire, une approche possible (disclaimer: Je n'ai pas testé ce fragment de code) est la suivante:

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

Super. L'insertion de graphique par défaut fonctionne pour moi dans Fuseki. Je vais essayer avec mes autres magasins, plus l'insertion du graphique nommé et l'extrait RDF4J plus tard aujourd'hui. –