Skip to content

Releases: trickle-labs/pg-ripple

v0.128.0

Choose a tag to compare

@github-actions github-actions released this 22 May 11:07

Completes the register_json_mapping round-trip by adding a relational
write-back path (RDF → Relational). Changes to RDF triples can now be
automatically propagated back to the source relational table via direct SQL
calls or trigger-based async queueing.

Added

  • pg_ripple.writeback_json_row(mapping TEXT, subject_iri TEXT) → BIGINT
    exports the subject as JSON using the named mapping context, maps JSON keys to
    relational columns, and executes an INSERT … ON CONFLICT based on the
    configured conflict policy (replace, skip, error).
  • pg_ripple.writeback_json_row_delete(mapping TEXT, subject_iri TEXT) → BIGINT
    deletes the target relational row using decoded key-column values.
  • pg_ripple.enable_json_writeback(mapping TEXT) → VOID — installs
    AFTER INSERT OR DELETE FOR EACH ROW triggers on VP delta tables, enqueuing
    events into _pg_ripple.json_writeback_queue for async background processing.
  • pg_ripple.disable_json_writeback(mapping TEXT) → VOID — drops all
    writeback triggers; idempotent.
  • pg_ripple.json_writeback_status() → TABLE — operational view of queue
    depth, error count, and last_processed_at per mapping.
  • pg_ripple.json_writeback_batch_size GUC (default 100, range 0–10000) —
    rows drained per background merge-worker tick; set to 0 to disable auto-drain.
  • _pg_ripple.json_writeback_queue catalog table — asynchronous writeback
    event queue with mapping_name, subject_id, operation, queued_at,
    processed_at, error.
  • _pg_ripple.json_writeback_enqueue_fn() PL/pgSQL trigger function —
    enqueues VP delta changes into the writeback queue.
  • Five new columns on _pg_ripple.json_mappings: writeback_table,
    writeback_schema (default 'public'), writeback_key_columns (default
    {}), writeback_conflict_policy (default 'replace'),
    writeback_enabled (default false).
  • HTTP POST /json-mapping/{name}/writeback — synchronous single-subject
    writeback; returns {"rows_affected": N}; requires write-auth.
  • HTTP GET /json-mapping/{name}/writeback/status — queue depth, error
    count, and last_error JSON; requires read-auth.
  • feature_status() now includes 'json_mapping_writeback' entry.
  • Blog post blog/json-ld-reverse-mapping.md.
  • Docs page docs/src/features/json-mapping.md.
  • GUC docs in docs/src/reference/guc-reference.md.
  • 21 pg_regress tests in tests/pg_regress/sql/v0128_json_writeback.sql.

Changed

  • Background merge worker (worker 0) now drains _pg_ripple.json_writeback_queue
    after each merge cycle when json_writeback_batch_size > 0.

Migration

  • sql/pg_ripple--0.127.0--0.128.0.sqlALTER TABLE _pg_ripple.json_mappings ADD COLUMN IF NOT EXISTS …; CREATE TABLE _pg_ripple.json_writeback_queue;
    index on pending rows; json_writeback_enqueue_fn() PL/pgSQL trigger function.

v0.127.0

Choose a tag to compare

@github-actions github-actions released this 22 May 09:37

Moves relay-facing CDC bridge behavior from the obsolete pg-trickle relay model
to pg_tide named outboxes, updates the project documentation to current pg_tide
terminology and deployment commands, and adds a detailed remediation plan for the
remaining historical references.

pg_trickle remains the companion extension for incremental view maintenance only.
Relay, outbox, inbox, consumer-group, and relay-process guidance now points at
pg_tide. The CDC bridge now validates pg_tide availability and publishes events
with tide.outbox_publish() instead of inserting into a pg-trickle-style outbox
table, while retaining compatibility names for existing callers.

Added

  • PGTIDE-RELAY-01 pg_ripple.relay_available() -> BOOLEAN canonical SQL
    helper for relay/outbox/inbox availability checks.
  • PGTIDE-RELAY-02 _pg_ripple.cdc_bridge_triggers.outbox_name catalog column
    for pg_tide outbox names, with outbox_table retained as a compatibility alias.
  • PGTIDE-DOC-01 pg-tide-relay-fixes.md detailed
    research and remediation plan.
  • Migration script sql/pg_ripple--0.126.0--0.127.0.sql.
  • Roadmap file roadmap/v0.127.0.md.

Changed

  • PGTIDE-RELAY-03 CDC bridge trigger publishing now calls
    tide.outbox_publish(outbox_name, payload, headers) and stores the stable
    ripple:{statement_id} dedup key in pg_tide headers.
  • PGTIDE-RELAY-04 Deprecated pg_ripple.trickle_available() now aliases
    relay_available() for relay checks; use pg_ripple.pg_trickle_available()
    for IVM checks.
  • PGTIDE-DOC-02 User-facing relay docs, runbooks, examples, and Docker
    snippets now use the pg-tide command, ghcr.io/trickle-labs/pg-tide image,
    PG_TIDE_POSTGRES_URL, and stable tide.relay_set_outbox_v2() /
    tide.relay_set_inbox_v2() SQL APIs.
  • DEP-01 pg_tide tested/bundled version bumped from 0.16.0 to 0.33.0
    in .versions.toml and Dockerfile.
  • pg_ripple_http: COMPATIBLE_EXTENSION_MIN bumped from "0.125.0" to
    "0.126.0".

v0.126.0

Choose a tag to compare

@github-actions github-actions released this 20 May 17:00

Adds encrypted per-endpoint OAuth2 Bearer / API-key credential storage with
pgcrypto-backed pgp_sym_encrypt, a credential audit view, atomic rotation,
automatic header injection in the federation executor, and 10 new regression
tests.

Federated SPARQL queries that span multiple organizations or external data services almost always require authentication, and managing those credentials securely across a distributed knowledge graph deployment has been a notable gap in pg_ripple's federation story. This release closes that gap with a dedicated per-endpoint credential management system: Bearer tokens and API keys can be registered for any federation endpoint and are stored encrypted at rest using pgcrypto's OpenPGP symmetric encryption, protected by a superuser-only key that is never visible through SHOW or any administrative view. The plaintext of a stored credential is never returned by any query, function, or diagnostic endpoint — only the holder of the encryption key can decrypt it, and the key itself is never stored in the database. A credential audit view exposes operational metadata such as token age and last-used timestamp without ever exposing the underlying secret.

The operational workflow is designed for production credential management at scale. set_federation_credential() registers or atomically replaces credentials for any endpoint, while rotate_federation_credential() replaces a token and records the rotation timestamp in a single atomic operation, enabling automated rotation pipelines without authentication gaps. The federation query executor automatically retrieves and injects the correct HTTP header for each endpoint after SSRF validation, so existing SPARQL queries and application code require no changes when credentials are added, rotated, or removed. A matching HTTP endpoint exposes auth status for external monitoring and compliance dashboards, and ten regression tests validate the full lifecycle from initial storage through rotation through audit reporting, ensuring the feature behaves correctly across upgrade paths.

Added

  • FEAT-03 pg_ripple.set_federation_credential(endpoint_iri TEXT, auth_type TEXT, token TEXT)
    — registers or replaces an encrypted credential for a federation endpoint.
    Tokens encrypted at-rest via pgcrypto.pgp_sym_encrypt using the
    pg_ripple.federation_credential_key GUC (superuser-only, never visible via
    SHOW). Errors: PT0510 (no key), PT0511 (no pgcrypto), PT0512 (unknown
    endpoint), PT0513 (invalid auth_type), PT0514 (encrypt fail), PT0515 (upsert fail).
  • FEAT-03 pg_ripple.rotate_federation_credential(endpoint_iri TEXT, new_token TEXT)
    — atomically replaces the token and records rotated_at = now(). Error:
    PT0516 (no credential for that endpoint).
  • FEAT-03 pg_ripple.federation_credential_audit() → TABLE(endpoint_iri TEXT, auth_type TEXT, token_age_days DOUBLE PRECISION, last_used_at TIMESTAMPTZ)
    — operational metadata only; never returns plaintext tokens.
  • FEAT-03 _pg_ripple.federation_credentials table — stores encrypted tokens
    with auth_type CHECK ('bearer','apikey','none'), header_name, created_at,
    rotated_at, and last_used_at. FK to _pg_ripple.federation_endpoints(url).
  • FEAT-03 GUC pg_ripple.federation_credential_key — symmetric key for
    pgp_sym_encrypt/pgp_sym_decrypt. NO_SHOW_ALL | SUPERUSER_ONLY.
  • FEAT-03 Federation executor (src/sparql/federation/http.rs) automatically
    injects the appropriate HTTP header (Bearer / API-key) after SSRF validation.
    Credential lookup happens post-SSRF to prevent credential-oracle attacks.
  • FEAT-03 HTTP endpoint GET /federation/{endpoint}/auth-status — returns
    JSON with endpoint_iri, auth_type, token_age_days, and last_used_at.
    Requires write-level authentication.
  • CRED-01–10 tests/pg_regress/sql/v0126_federation_credentials.sql — 10
    regression tests covering table existence, GUC registration, function presence,
    column schema, constraint enforcement, and audit function.
  • Migration script sql/pg_ripple--0.125.0--0.126.0.sql.
  • Roadmap file roadmap/v0.126.0.md.

Changed

  • pg_ripple_http: COMPATIBLE_EXTENSION_MIN remains "0.125.0" (one-version
    trailing window; v0.126.0 introduces backward-compatible additions only).

v0.125.0

Choose a tag to compare

@github-actions github-actions released this 20 May 13:38

Adds point-in-time named-graph snapshots via pg_ripple.graph_at(),
a diff API via pg_ripple.graph_diff(), two HTTP endpoints, a Prometheus
gauge, automatic GC, and 15 new regression tests.

Added

  • FEAT-02 pg_ripple.graph_at(graph_iri TEXT, snapshot_time TIMESTAMPTZ) → TEXT
    — materialises a named-graph snapshot from _pg_ripple.temporal_facts at the
    given timestamp. Registers the snapshot in _pg_ripple.graph_snapshots and
    returns a deterministic urn:snapshot:… IRI for use in GRAPH <iri> { … }
    SPARQL queries.
  • FEAT-02 pg_ripple.graph_diff(graph_iri TEXT, from_ts TIMESTAMPTZ, to_ts TIMESTAMPTZ) → TABLE(s BIGINT, p BIGINT, o BIGINT, change TEXT)
    — returns 'added'/'removed' delta rows between two temporal snapshots,
    enabling audit-compliance workflows and incremental Turtle/N-Quads exports.
  • FEAT-02 pg_ripple.graph_snapshots_count() → BIGINT
    — returns the current live snapshot count.
  • FEAT-02 _pg_ripple.graph_snapshots table and _pg_ripple.snapshot_id_seq
    sequence — catalog of registered snapshots with expires_at for GC.
  • FEAT-02 GUC pg_ripple.snapshot_retention_days (default 30) — automatic
    GC of expired snapshots by the merge background worker tick.
  • FEAT-02 GET /temporal/graphs/{iri}/snapshot?at=<iso8601> HTTP endpoint
    — returns snapshot content as Turtle with X-Snapshot-IRI response header.
  • FEAT-02 GET /temporal/graphs/{iri}/diff?from=<iso8601>&to=<iso8601> HTTP
    endpoint — returns N-Quads delta between two timestamps.
  • FEAT-02 Prometheus gauge pg_ripple_graph_snapshots_total — tracks live
    snapshot count; updated on each /temporal/graphs/{iri}/snapshot call.
  • SNAP-01–15 tests/pg_regress/sql/v0125_temporal_graph_snapshots.sql — 15
    regression tests covering snapshot creation, idempotency, count tracking,
    diff correctness, retention GUC, and table schema.
  • Migration script sql/pg_ripple--0.124.0--0.125.0.sql — adds graph_snapshots
    table and snapshot_id_seq sequence.
  • Roadmap file roadmap/v0.125.0.md.
  • Blog post blog/temporal-graph-snapshots.md.

Changed

  • pg_ripple_http: COMPATIBLE_EXTENSION_MIN bumped from "0.123.0" to "0.125.0".

v0.124.0

Choose a tag to compare

@github-actions github-actions released this 20 May 10:13

Fixes a Cartesian-product bug (PATH-BNODE-01) in the SPARQL property path
translator and adds 25 new regression tests covering all eight path algebra
operators plus OWL 2 RL propertyChainAxiom n-hop chains.

Fixed

  • PATH-BNODE-01 GraphPattern::Path translator in src/sparql/sqlgen.rs
    now calls bgp::bind_term() for both subject and object instead of only
    handling TermPattern::Variable. When spargebra/sparopt decomposes a
    Sequence path (e.g. hop*/hop, hop?/hop, ^hop/!hop) into two
    GraphPattern::Path nodes connected by an anonymous blank node, the blank
    node is now registered in frag.bindings; Fragment::merge then generates
    the correct INNER JOIN condition (_t0.o = _t1.s) instead of a Cartesian
    product. This eliminated ×N duplicate rows (e.g. 30 rows → 5 for a
    5-hop chain with hop*/hop).

Added

  • TEST-01 tests/pg_regress/sql/sparql12_property_paths.sql — 20 regression
    tests covering all 8 PropertyPathExpression variants (NamedNode, Reverse,
    Sequence, Alternative, OneOrMore, ZeroOrMore, ZeroOrOne,
    NegatedPropertySet) and 5 compound operator combinations.
  • TEST-02 tests/pg_regress/sql/sparql12_owl_chain_nhop.sql — 5 regression
    tests for OWL 2 RL owl:propertyChainAxiom n=4 and n=5 hop chains with
    SPARQL path cross-validation.
  • DOC-01 docs/src/reference/sparql12-status.md — new reference page with
    operator coverage table, PATH-BNODE-01 root-cause analysis, and known limitations.
  • docs/src/SUMMARY.md updated to link the new reference page.
  • Migration script sql/pg_ripple--0.123.0--0.124.0.sql (comment-only; no DDL changes).
  • Roadmap file roadmap/v0.124.0.md.

Changed

  • pg_ripple_http: COMPATIBLE_EXTENSION_MIN bumped from "0.122.0" to "0.123.0".

v0.123.0

Choose a tag to compare

@github-actions github-actions released this 19 May 18:41

Completes the Assessment 17 remediation arc. Adds replica-pool Prometheus
gauges (OBS-M-01), rule-library stream observability (OBS-M-02),
bench_workload_result() convenience wrapper (ERG-L-01), eight new compatibility
matrix rows (DOC-M-01), comprehensive SQL API reference (DOC-M-03), four new blog
posts (DOC-L-01), and RSA/paste advisory maintenance (SEC-M-01/SEC-M-02).

Added

  • OBS-M-01 pg_ripple_http_replica_pool_size{pool="replica"} and
    pg_ripple_http_replica_pool_available{pool="replica"} Prometheus gauges
    in pg_ripple_http/src/metrics.rs; scraped live at every /metrics call.
  • OBS-M-02 pg_ripple_rule_library_stream_duration_seconds cumulative
    latency counter and pg_ripple_rule_library_subscribe_errors_total error
    counter; wired into routing/rule_library_handler.rs.
  • ERG-L-01 pg_ripple.bench_workload_result(profile TEXT DEFAULT 'bsbm')
    SQL convenience wrapper returning the most recent benchmark run from
    _pg_ripple.bench_history (defined in migration script).
  • ERG-M-01 docs/src/reference/sql-api.md — new reference page documenting
    compat_check() JSON schema with copy-pasteable example.
  • ERG-M-02 / DOC-M-02 docs/src/guides/rule-library-federation.md — complete
    publish → subscribe → verify inference → monitor worked example.
  • ERG-M-03 docs/src/operations/read-replicas.md — new page documenting
    ?replica=ok routing semantics, eligible query types, pool exhaustion
    fallback, and Prometheus alerting recipes.
  • DOC-M-01 Eight new rows (v0.113.0–v0.120.0) added to docs/src/operations/compatibility.md.
  • DOC-M-03 docs/src/reference/sql-api.md extended with function signatures,
    parameter descriptions, and examples for bench_workload(), bench_workload_result(),
    publish_rule_library(), subscribe_rule_library(), and all seven Allen's
    interval relation functions.
  • DOC-L-01 Four new blog posts:
    • blog/owl-property-chain-axiom.md
    • blog/federation-circuit-breaker.md
    • blog/allen-interval-relations.md
    • blog/rule-library-federation.md
  • Migration script sql/pg_ripple--0.122.0--0.123.0.sql.
  • Roadmap file roadmap/v0.123.0.md.

Changed

  • SEC-M-01 Extended RUSTSEC-2024-0436 and RUSTSEC-2023-0071 (RSA Marvin-attack)
    audit.toml expiry to 2027-01-01; updated comments with
    "RSA not used for untrusted input — re-evaluated Q3-2026" rationale.
  • SEC-M-02 Added detailed mitigation rationale for RUSTSEC-2026-0104 (paste proc-macro unsoundness) in audit.toml; see roadmap/v0.123.0.md for full justification.
  • COMPAT-01 COMPATIBLE_EXTENSION_MIN bumped to "0.122.0" in
    pg_ripple_http/src/main.rs.

v0.122.0

Choose a tag to compare

@github-actions github-actions released this 19 May 15:10

Decomposes all eight remaining god-modules (H17-02): 0 source files exceed 1,000 LOC.
CI file-size gate tightened from 1,800 to 1,000 lines. Five new pg_regress test suites added.
All 290 pg_regress tests pass.

Changed

  • H17-02 / PERF-M-02 src/sparql/expr/functions.rs (was 1,252 LOC) rewritten as
    a thin dispatch table (~90 LOC); logic extracted to seven sub-modules:
    string.rs, datetime.rs, numeric.rs, iri.rs, aggregate.rs, geo.rs, temporal.rs.
  • H17-02 / PERF-L-01 src/storage/ops/scan.rs (was 1,171 LOC) split: deduplication
    helpers extracted to src/storage/ops/dedup.rs.
  • H17-02 src/bulk_load.rs (was 1,173 LOC) converted to directory module;
    JSON ingest extracted to json_ingest.rs, confidence helpers to confidence.rs.
  • PERF-M-03 pg_ripple_http/src/routing/admin_handlers.rs (was 1,168 LOC) converted
    to directory module; explorer page extracted to explorer.rs, diagnostic snapshot to diagnostic.rs.
  • PERF-L-02 src/llm/mod.rs (was 1,071 LOC) split: Automated Ontology Mapping
    functions (suggest_mappings, kge_entity_similarity, etc.) extracted to mapping.rs.
  • H17-02 src/datalog/compiler/mod.rs (was 1,068 LOC) split: SQL helper functions
    (build_join_cond, render_comparison_term, etc.) extracted to helpers.rs.
  • H17-02 src/gucs/registration/storage.rs (was 1,058 LOC) split: v0.81.0+
    GUC registrations extracted to storage_late.rs via #[path] sub-module.
  • H17-02 src/datalog/parser.rs (was 1,030 LOC) split: test module extracted
    to parser_tests.rs via #[path] declaration.
  • CI gate tightened: lint-file-size step updated from 1,800-line limit to 1,000-line
    limit (Q13-04 v0.85.0, tightened v0.122.0 H17-02). Zero files exceed 1,000 LOC.

Added

  • Test coverage Five new pg_regress test suites covering v0.120.0 features:
    • v0120_diagnostic_snapshot.sql — validates diagnostic_report() keys for HTTP
      diagnostic-snapshot endpoint (DIAG-01 through DIAG-04)
    • v0120_read_replica_routing.sql — validates read_replica_dsn GUC existence and
      primary-fallback behaviour (REPLICA-01 through REPLICA-04)
    • v0120_compat_check.sql — more thorough compat_check() JSON schema validation
      (COMPAT-10 through COMPAT-14)
    • v0120_tenant_quota.sql — validates tenant table schema and quota column
      (QUOTA-01 through QUOTA-04)
    • v0122_module_splits.sql — spot-checks public API for regressions from all splits
      (SPLIT-01 through SPLIT-05)
  • Migration script sql/pg_ripple--0.121.0--0.122.0.sql (no schema changes).
  • Roadmap file roadmap/v0.122.0.md created.

v0.121.0

Choose a tag to compare

@github-actions github-actions released this 19 May 11:34

Closes the two High security findings from Assessment 17 (H17-01 SSRF bypass in
subscribe_rule_library, SEC-M-03 CGNAT/multicast SSRF gaps) and all medium/low
bug and security items. All 284 pg_regress tests pass.

Security

  • H17-01 / SEC-H-01 subscribe_rule_library() SSRF guard replaced:
    naive string-contains matching (lower.contains("://127.") etc.) that could
    be bypassed by hostname embedding replaced with
    resolve_and_check_endpoint(source_uri)? from
    src/sparql/federation/policy.rs. The new guard performs actual DNS
    resolution and validates all resolved IP addresses against the full blocklist,
    preventing DNS rebinding attacks and URL-embedding bypasses.
  • SEC-M-03 SSRF blocklist expanded with four new ranges
    (ci/regress: v0121_ssrf_hardening.sql — SSRF-01 through SSRF-04):
    • CGNAT 100.64.0.0/10 (RFC 6598) added to is_private_ip() and is_blocked_host() — ci/regress: SSRF-02
    • IPv4 multicast 224.0.0.0/4 added — ci/regress: SSRF-03
    • This-network 0.0.0.0/8 added — ci/regress: SSRF-04
    • IPv4-mapped IPv6 ::ffff:0:0/96 added with recursive IPv4 re-check — ci/regress: SSRF-01
  • SEC-M-04 // SAFETY-SQL: pred_id is i64, no injection possible comments
    added to three format!-based DDL calls in src/datalog/magic.rs; let _ =
    silencing replaced with unwrap_or_else(|e| pgrx::warning!(...)).
  • SEC-L-01 Content-Type: text/event-stream; charset=utf-8 now explicitly
    enforced on /rule-libraries/{name}/stream responses.

Fixed

  • BUG-M-01 Six let _ = pgrx::Spi::run(...) calls in
    src/maintenance_api.rs replaced with unwrap_or_else(|e| pgrx::warning!)
    so ANALYZE/REINDEX errors surface to the user rather than silently failing.
  • BUG-M-02 let _ = silencing in src/kge.rs:234 and
    src/llm/mod.rs:730 replaced with unwrap_or_else warning surfacing.
  • BUG-M-03 // CLIPPY-OK: side-effect only — errors from parse_head_object are expected and non-fatal here comment added to src/datalog/conflict.rs:457.

Added

  • OBS-L-01 mutation_journal::record_schema_op(op, target) helper added (ci/regress: v0121_ssrf_hardening.sql); called at end of
    publish_rule_library() and subscribe_rule_library() for server-log audit trail
    so schema-mutating rule-library operations appear in the PostgreSQL server log
    audit trail.
  • Fuzz target fuzz/fuzz_targets/rule_library_ssrf.rs covers the
    subscribe_rule_library() SSRF URL validation path and the rule-library
    NDJSON stream parser. Registered in fuzz/Cargo.toml.
  • pg_regress tests/pg_regress/sql/v0121_ssrf_hardening.sql adds 7 SSRF
    regression tests: IPv6-mapped private address blocked (SSRF-01), CGNAT range
    blocked (SSRF-02), IPv4 multicast blocked (SSRF-03), this-network blocked
    (SSRF-04), loopback regression guard (SSRF-05), public URI passes check
    (SSRF-06), and version check (SSRF-07).
  • Migration sql/pg_ripple--0.120.0--0.121.0.sql — comment-only, no
    schema changes.
  • COMPATIBLE_EXTENSION_MIN bumped to "0.120.0" in pg_ripple_http/src/main.rs
    (release.yml compat-check gate requires ≤1 minor version lag).

v0.120.0

Choose a tag to compare

@github-actions github-actions released this 19 May 06:18
e9fb82a

Nine features across the HTTP companion and Helm chart: improved PageRank explain
with URL-decoding and score lookup; admin diagnostic snapshot; tenant quota HTTP
endpoints; Rule-Library Federation (publish/subscribe); read-replica routing via
?replica=ok; per-tenant Helm values recipe; Helm PodDisruptionBudget; and
compatibility minimum bump to v0.119.0.

Added

  • Feature 7 GET /pagerank/explain/{node_iri}: URL-decodes the node IRI,
    looks up the current PageRank score from _pg_ripple.pagerank_scores, and
    returns a richer JSON response {"node": "...", "score": 0.xx, "top_contributors": [...], "method": "datalog_pagerank"} with depth,
    contributor, contribution, and path fields per contributor.

  • Feature 8 GET /admin/diagnostic-snapshot (requires write auth): collects
    all _pg_ripple.* table row counts, non-sensitive GUC values, extension and
    HTTP companion versions, and a Prometheus metrics snapshot into a single JSON.

  • Tenant Quota HTTP Endpoints: GET /tenants/{name}/quota returns current
    usage and remaining capacity; POST /tenants/{name}/quota updates
    quota_triples.

  • Feature 11 — Rule-Library Federation: SQL functions
    pg_ripple.publish_rule_library(name, endpoint_uri) and
    pg_ripple.subscribe_rule_library(source_uri, name). HTTP:
    GET /rule-libraries/{name}/stream and POST /rule-libraries/{name}/subscribe.

  • Feature 12 — Read-Replica Routing: ?replica=ok on SPARQL GET/POST routes
    read-only queries to a standby pool (PG_RIPPLE_HTTP_REPLICA_DSN).

  • just generate-helm-values TENANT=<name> recipe for per-tenant Helm fragments.

  • Helm PodDisruptionBudget (charts/pg_ripple/templates/pdb.yaml): enabled
    by default with minAvailable: 1.

Changed

  • COMPATIBLE_EXTENSION_MIN bumped to "0.119.0" in pg_ripple_http.

Fixed

  • sparql_post handler: ?replica=ok now honoured on POST requests.

v0.119.0

Choose a tag to compare

@github-actions github-actions released this 18 May 21:25
40fefe5

Three new features: owl:propertyChainAxiom support in OWL-RL built-ins (Feature 5);
persistent federation SERVICE circuit-breaker state with Prometheus gauge (Feature 6);
schema-aware NL→SPARQL with vocabulary bundle injection (Feature 10). Also fixes
property-path queries that coexist with RDF-star quoted triple patterns.

Added

  • Feature 5 owl:propertyChainAxiom rule in OWL-RL Datalog built-ins
    (src/datalog/builtins.rs). A two-step chain (p1 ∘ p2 → p) is now inferred
    correctly by SELECT pg_ripple.infer('owl-rl'). Cycle-safe via PG 18 WITH RECURSIVE … CYCLE clause. Ten canonical pg_regress tests cover FOAF, SKOS,
    PROV-O, family-chain, concurrent axioms, owl:inverseOf, 3-hop acquaintance,
    rdfs:subPropertyOf, and LUBM indirectAdvisor chain.

  • Feature 6 _pg_ripple.federation_circuit_state table
    (endpoint_iri TEXT PRIMARY KEY, state TEXT CHECK (state IN ('closed','open','half_open')), last_failure_at TIMESTAMPTZ, failure_count INT) persists SERVICE circuit-breaker
    state across backend restarts. State transitions are UPSERTED on every open/close/
    half-open event. A new pg_ripple_federation_circuit_state{endpoint="..."} Prometheus
    gauge (0 = closed, 1 = open, 2 = half_open) is exposed at /metrics.

  • Feature 10 pg_ripple.nl_sparql_include_bundles GUC (boolean, default on).
    When enabled, sparql_from_nl() automatically injects vocabulary bundle metadata
    (predicate labels from skos:prefLabel, dcterms:title, schema:name,
    foaf:name) into the LLM prompt, improving NL→SPARQL accuracy for ontology-rich
    datasets.

Fixed

  • Property-path queries (+, *, /, ?) now execute without error when the
    same SPARQL query also contains RDF-star quoted triple patterns (<< s p o >>).
    The gap was in the property-path SQL generator ignoring the RDF-star graph
    overlay; now the correct triple source is selected in all cases.

Migrations

  • sql/pg_ripple--0.118.0--0.119.0.sql — creates _pg_ripple.federation_circuit_state.