xmlrdf/commit
Working on a better rename
author | Jan Wielemaker |
---|---|
Mon Jan 14 17:09:02 2013 +0100 | |
committer | Jan Wielemaker |
Mon Jan 14 17:09:02 2013 +0100 | |
commit | 91435f9085a9f588b72e0d78ae7c7471ce55f3c7 |
tree | 1e4b4ae6b7ba06eb06ad75b1ad5e421e50b83e2b |
parent | ec8cf3d77f667cda6e5463ed4e89756aa9e54340 |
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). +