2017-12-21 6 views
0

ich eine Ontologie mit verschiedenen Präfixen erstellt (rdf:, rdfs:, owl:, example:, car:, bike:, ...). Ich benutze sie, um verschiedene Domänen und Beispiele abzugrenzen.ändern PREFIX in SPARQL

Ein kleiner Auszug:

car:Software rdf:type demo:CyberObject. 
car:Hardware rdf:type spdm:PhysicalObject. 
car:Software car:hasMaturity "ten". 
car:Hardware demo:isProducedIn loc:NorthPole. 

Gibt es eine Möglichkeit ein PREFIX "car:" auf, zum Beispiel zu ändern "plane:", und die Beziehungen halten:

plane:Software rdf:type demo:CyberObject. 
plane:Hardware rdf:type spdm:PhysicalObject. 
plane:Software plane:hasMaturity "ten". 
plane:Hardware demo:isProducedIn loc:NorthPole. 

Ich brauche immer noch alle Beziehungen. Die Objekte mit PREFIX "car:" müssen nicht ersetzt werden; es würde reichen, neue mit dem neuen PREFIX zu erstellen und das alte Objekt in der Datenbank zu behalten.

Vielen Dank für jeden Hinweis!

+0

SPARQL 1.1 Update-Abfrage funktioniert nicht? Ersetzen Sie die alte URI durch die neue URI, oder was genau ist hier das Problem? – AKSW

+0

Die Ontologie existiert bereits im Ontologie-Editor/Triple-Store. Ich möchte nur Präfixe von bestehenden Knoten ändern @ AKSW – Boris

+0

Ich weiß, was Sie tun wollten. Aber ich sehe nicht, was Sie bisher versucht haben ... aber wissen Sie, es ist egal, sehen Sie die perfekte Antwort von @StanislavKralin unten (und akzeptieren Sie es) – AKSW

Antwort

2

Präfixe in Subjekten, Prädikaten und Objekten nacheinander ersetzen.

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix car: <http://example.com/car/> 
prefix demo: <http://example.com/demo/> 
prefix spdm: <http://example.com/spdm/> 
prefix loc: <http://example.com/loc/> 
prefix plane: <http://example.com/plane/> 

DELETE {?s ?p1 ?o} INSERT {?s ?p2 ?o} WHERE 
{ 
?s ?p1 ?o . 
FILTER (strstarts(str(?p1), str(car:))) 
BIND (IRI(replace(str(?p1), str(car:), str(plane:))) AS ?p2) 
} ; 

DELETE {?s1 ?p ?o} INSERT {?s2 ?p ?o} WHERE 
{ 
?s1 ?p ?o . 
FILTER (strstarts(str(?s1), str(car:))) 
BIND (IRI(replace(str(?s1), str(car:), str(plane:))) AS ?s2) 
} ; 

DELETE {?s ?p ?o1} INSERT {?s ?p ?o2} WHERE 
{ 
?s ?p ?o1 . 
FILTER (strstarts(str(?o1), str(car:)) && isIRI(?o1)) 
BIND (IRI(replace(str(?o1), str(car:), str(plane:))) AS ?o2) 
} ; 

Nicht in Allegrograph getestet, und möglicherweise gibt es Allegrograph-spezifische Lösungen.

aktualisieren

Ich brauche noch alle Beziehungen, die Objekte mit Vorsilbe „Auto“ nicht ersetzt werden müssen ...

Dann ersetzen nicht Präfixe in Objekten. Beachten Sie jedoch, dass ein Objekt in einem Tripel ein Subjekt in einem anderen Tripel sein kann.

... es wäre genug, neue mit der neuen PREFIX zu erstellen und das alte Objekt in der Datenbank zu behalten.

"Standalone" URIs werden nicht im TripleStore gespeichert.