Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 54s
unrelate-node! retracts every local edge touching a node (all kinds, both directions); leaves federated peer links alone. 147/147. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
142 lines
3.6 KiB
Plaintext
142 lines
3.6 KiB
Plaintext
;; lib/relations/api.sx — relationship lifecycle + current-db convenience layer.
|
|
;;
|
|
;; A relations db is a live Datalog db holding rel(Src,Dst,Kind) facts (and, for
|
|
;; federation, peer_rel/trust facts) under the engine ruleset
|
|
;; (lib/relations/engine.sx). The query functions live in engine.sx; this module
|
|
;; owns db construction, the assert/retract lifecycle, and a current-db
|
|
;; convenience layer for callers that load a fact base once and query without
|
|
;; threading the db around. This mirrors lib/acl/api.sx.
|
|
|
|
(define
|
|
relations-build-db
|
|
(fn (facts) (dl-program-data facts relations-rules)))
|
|
|
|
(define relations-current-db nil)
|
|
|
|
(define
|
|
relations/load!
|
|
(fn
|
|
(facts)
|
|
(do
|
|
(set! relations-current-db (relations-build-db facts))
|
|
relations-current-db)))
|
|
|
|
(define
|
|
relations-ensure-db!
|
|
(fn
|
|
()
|
|
(do
|
|
(when
|
|
(= relations-current-db nil)
|
|
(set! relations-current-db (relations-build-db (list))))
|
|
relations-current-db)))
|
|
|
|
;; Add a relationship to the current db (re-saturates).
|
|
(define
|
|
relations/relate
|
|
(fn
|
|
(src dst kind)
|
|
(dl-assert! (relations-ensure-db!) (relations-rel src dst kind))))
|
|
|
|
;; Remove a relationship from the current db (re-saturates).
|
|
(define
|
|
relations/unrelate
|
|
(fn
|
|
(src dst kind)
|
|
(dl-retract! (relations-ensure-db!) (relations-rel src dst kind))))
|
|
|
|
(define
|
|
relations/children
|
|
(fn (node kind) (relations-children-of (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/parents
|
|
(fn (node kind) (relations-parents-of (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/related
|
|
(fn (node kind) (relations-related (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/descendants
|
|
(fn (node kind) (relations-descendants (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/ancestors
|
|
(fn (node kind) (relations-ancestors (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/reachable?
|
|
(fn (a b kind) (relations-reachable? (relations-ensure-db!) a b kind)))
|
|
|
|
(define
|
|
relations/roots
|
|
(fn (kind) (relations-roots (relations-ensure-db!) kind)))
|
|
|
|
(define
|
|
relations/leaves
|
|
(fn (kind) (relations-leaves (relations-ensure-db!) kind)))
|
|
|
|
(define
|
|
relations/cycle?
|
|
(fn (node kind) (relations-cycle? (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/acyclic?
|
|
(fn (kind) (relations-acyclic? (relations-ensure-db!) kind)))
|
|
|
|
(define
|
|
relations/siblings
|
|
(fn (node kind) (relations-siblings (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/out-degree
|
|
(fn (node kind) (relations-out-degree (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/in-degree
|
|
(fn (node kind) (relations-in-degree (relations-ensure-db!) node kind)))
|
|
|
|
(define
|
|
relations/connected?
|
|
(fn (a b kind) (relations-connected? (relations-ensure-db!) a b kind)))
|
|
|
|
(define
|
|
relations-relate-many!
|
|
(fn
|
|
(db triples)
|
|
(do
|
|
(for-each
|
|
(fn
|
|
(t)
|
|
(dl-assert!
|
|
db
|
|
(relations-rel (first t) (nth t 1) (nth t 2))))
|
|
triples)
|
|
db)))
|
|
|
|
(define
|
|
relations-unrelate-node!
|
|
(fn
|
|
(db node)
|
|
(do
|
|
(for-each
|
|
(fn
|
|
(s)
|
|
(dl-retract! db (relations-rel node (get s :Dst) (get s :Kind))))
|
|
(dl-query db (list (quote rel) node (quote Dst) (quote Kind))))
|
|
(for-each
|
|
(fn
|
|
(s)
|
|
(dl-retract! db (relations-rel (get s :Src) node (get s :Kind))))
|
|
(dl-query db (list (quote rel) (quote Src) node (quote Kind))))
|
|
db)))
|
|
|
|
(define
|
|
relations/relate-many!
|
|
(fn (triples) (relations-relate-many! (relations-ensure-db!) triples)))
|
|
|
|
(define
|
|
relations/unrelate-node!
|
|
(fn (node) (relations-unrelate-node! (relations-ensure-db!) node)))
|