diff --git a/rust-executor/src/perspectives/perspective_instance.rs b/rust-executor/src/perspectives/perspective_instance.rs index 7579798f0..0596fdbd2 100644 --- a/rust-executor/src/perspectives/perspective_instance.rs +++ b/rust-executor/src/perspectives/perspective_instance.rs @@ -1184,14 +1184,16 @@ impl PerspectiveInstance { log::error!("Error spawning Prolog engine: {:?}", e) }; - let fact_rebuild_needed = !diff.removals.is_empty() - || diff.additions.iter().any(|link| is_sdna_link(&link.data)); + let fact_rebuild_needed = diff.additions.iter().any(|link| is_sdna_link(&link.data)); let did_update = if !fact_rebuild_needed { let mut assertions: Vec = Vec::new(); for addition in &diff.additions { assertions.push(generic_link_fact("assert_link_and_triple", addition)); } + for removal in &diff.removals { + assertions.push(generic_link_fact("retract_link_and_triple", removal)); + } let query = format!("{}.", assertions.join(",")); match self_clone.prolog_query(query).await { diff --git a/rust-executor/src/perspectives/sdna.rs b/rust-executor/src/perspectives/sdna.rs index 82ac58cd2..7a9addb3e 100644 --- a/rust-executor/src/perspectives/sdna.rs +++ b/rust-executor/src/perspectives/sdna.rs @@ -494,6 +494,18 @@ url_decode_char(Char) --> [Char], { \+ member(Char, "%") }. assert_link_and_triple(Source, Predicate, Target, Timestamp, Author) :- (assert_link(Source, Predicate, Target, Timestamp, Author) ; true), (assert_triple(Source, Predicate, Target) ; true). + + retract_link(Source, Predicate, Target, Timestamp, Author) :- + link(Source, Predicate, Target, Timestamp, Author), + retract(link(Source, Predicate, Target, Timestamp, Author)). + + retract_triple(Source, Predicate, Target) :- + triple(Source, Predicate, Target), + retract(triple(Source, Predicate, Target)). + + retract_link_and_triple(Source, Predicate, Target, Timestamp, Author) :- + (retract_link(Source, Predicate, Target, Timestamp, Author) ; true), + (retract_triple(Source, Predicate, Target) ; true). "#; lines.extend(assert_link.split('\n').map(|s| s.to_string()));