xmlrdf/commit

Working on a better rename

authorJan Wielemaker
Mon Jan 14 17:09:02 2013 +0100
committerJan Wielemaker
Mon Jan 14 17:09:02 2013 +0100
commit91435f9085a9f588b72e0d78ae7c7471ce55f3c7
tree1e4b4ae6b7ba06eb06ad75b1ad5e421e50b83e2b
parentec8cf3d77f667cda6e5463ed4e89756aa9e54340
Diff style: patch stat
diff --git a/lib/xmlrdf/rdf_rename.pl b/lib/xmlrdf/rdf_rename.pl
index 537a1a3..25674c4 100644
--- a/lib/xmlrdf/rdf_rename.pl
+++ b/lib/xmlrdf/rdf_rename.pl
@@ -3,6 +3,9 @@
 	  ]).
 :- use_module(library(semweb/rdf_db)).
 
+:- rdf_meta
+	rdf_rename(r,r,r).
+
 %%	rdf_rename(+OldResource, +NewResource, ?Graph) is det.
 %
 %	Rename  a  resource,  changing  all   references  in  all  three
@@ -11,12 +14,43 @@
 
 rdf_rename(Old, Old, _) :- !.
 rdf_rename(Old, New, Graph) :-
-	rdf_transaction(rename(Old, New, Graph), rename(Old, New)).
-
-rename(Old, New, G) :-
-	forall(rdf(Old, P, O, G),
-	       rdf_update(Old, P, O, G, subject(New))),
-	forall(rdf(S, Old, O, G),
-	       rdf_update(S, Old, O, G, predicate(New))),
-	forall(rdf(S, P, Old, G),
-	       rdf_update(S, P, Old, G, object(New))).
+	rename(Old, New, Graph).
+%	rdf_transaction(rename(Old, New, Graph), rename(Old, New)).
+
+rename(O, N, G) :-
+	referencing_triples(O, G, Triples),
+	length(Triples, Count),
+	maplist(rename_triple(O,N), Triples, Mapped0),
+	sort(Mapped0, Mapped),
+	length(Mapped, NewCount),
+	debug(rdf(rename), 'Renaming ~D triples into ~D', [Count, NewCount]),
+	retract_old(Triples),
+	assert_new(Mapped).
+
+referencing_triples(R, G, Triples) :-
+	findall(T, referencing_triple(R, G, T), Triples0),
+	sort(Triples0, Triples).
+
+referencing_triple(S, G, rdf(S,P,O,G)) :- rdf(S,P,O,G).
+referencing_triple(P, G, rdf(S,P,O,G)) :- rdf(S,P,O,G).
+referencing_triple(O, G, rdf(S,P,O,G)) :- rdf(S,P,O,G).
+
+rename_triple(Old, New, rdf(S0,P0,O0,G0), rdf(S,P,O,G)) :-
+	rename(S0, Old, New, S),
+	rename(P0, Old, New, P),
+	rename(O0, Old, New, O),
+	rename(G0, Old, New, G).
+
+rename(O, O, N, N) :- !.
+rename(R, _, _, R).
+
+retract_old([]).
+retract_old([rdf(S,P,O,G)|T]) :-
+	rdf_retractall(S,P,O,G),
+	retract_old(T).
+
+assert_new([]).
+assert_new([rdf(S,P,O,G)|T]) :-
+	rdf_assert(S,P,O,G),
+	assert_new(T).
+