provsql

PostgreSQL 半环溯源与不确定性管理扩展

概览

扩展包名版本分类许可证语言
provsql1.11.0FEATMITC++
ID扩展名BinLibLoadCreateTrustReloc模式
2900provsql-
相关扩展uuid-ossp

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.11.01817161514provsqluuid-ossp
RPMPIGSTY1.11.01817161514provsql_$v-
DEBPIGSTY1.11.01817161514postgresql-$v-provsql-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
u22.x86_64
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
u22.aarch64
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
u24.x86_64
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
u24.aarch64
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
PIGSTY 1.11.0
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 provsql 扩展的 RPM / DEB 包:

pig build pkg provsql         # 构建 RPM / DEB 包

安装

您可以直接安装 provsql 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install provsql;          # 当前活跃 PG 版本安装
pig ext install -y provsql -v 18  # PG 18
pig ext install -y provsql -v 17  # PG 17
pig ext install -y provsql -v 16  # PG 16
pig ext install -y provsql -v 15  # PG 15
pig ext install -y provsql -v 14  # PG 14
dnf install -y provsql_18       # PG 18
dnf install -y provsql_17       # PG 17
dnf install -y provsql_16       # PG 16
dnf install -y provsql_15       # PG 15
dnf install -y provsql_14       # PG 14
apt install -y postgresql-18-provsql   # PG 18
apt install -y postgresql-17-provsql   # PG 17
apt install -y postgresql-16-provsql   # PG 16
apt install -y postgresql-15-provsql   # PG 15
apt install -y postgresql-14-provsql   # PG 14

预加载配置

shared_preload_libraries = 'provsql';

创建扩展

CREATE EXTENSION provsql CASCADE;  -- 依赖: uuid-ossp

用法

来源:

provsql 将半环证明和不确定性管理添加到 PostgreSQL 中。上游文档介绍了证明跟踪、半环评估、概率、Shapley 和 Banzhaf 值、来源证明、更新证明以及时间特征。

加载并追踪证明

shared_preload_libraries = 'provsql'
CREATE EXTENSION provsql CASCADE;

CASCADE 形式会自动安装 uuid-ossp(如果需要)。入门指南指出,预加载步骤是必需的,因为 ProvSQL 安装了一个计划器挂钩。

SELECT provsql.add_provenance('mytable');

SELECT name, provenance()
FROM mytable;

SELECT provsql.remove_provenance('mytable');

用户文档还描述了证明映射:

SELECT create_provenance_mapping('my_mapping', 'mytable', 'column_name');
SELECT create_provenance_mapping_view('my_mapping_view', 'mytable', 'column_name');

概率与影响

为元组标记分配概率:

SELECT set_prob(provenance(), 0.8)
FROM mytable
WHERE id = 1;

SELECT name, probability_evaluate(provenance()) AS prob
FROM mytable;

计算影响得分:

SELECT shapley(provenance(), m.token)
FROM mytable, my_mapping AS m;

SELECT banzhaf(provenance(), m.token)
FROM mytable, my_mapping AS m;

文档中也介绍了 shapley_all_varsbanzhaf_all_vars,用于一次性计算所有输入变量的得分。

内置半环

内置半环函数使用证明标记和证明映射表:

SELECT name, sr_boolean(provenance(), 'my_mapping')
FROM mytable;

SELECT name, sr_formula(provenance(), 'my_mapping')
FROM mytable;

SELECT name, sr_how(provenance(), 'my_mapping')
FROM mytable;

当前文档包括编译后的包装器:sr_howsr_whichsr_tropicalsr_viterbisr_lukasiewiczsr_minmaxsr_maxmin。对于 PostgreSQL 14 及以上版本,它们还包括对多范围值的 sr_temporalsr_interval_numsr_interval_int

SELECT city,
       sr_minmax(provenance(), 'personnel_level',
                 'unclassified'::classification_level) AS clearance
FROM (SELECT DISTINCT city FROM personnel) AS t;

SELECT entity_id, sr_temporal(provenance(), 'validity_mapping')
FROM mytable;

高级用户仍然可以定义自定义半环,并使用 provenance_evaluateaggregation_evaluate 评估它们;上游建议当一个半环匹配所需的代数时,使用编译的半环。

额外模式和助手

上游文档中记录的会话 GUC 包括:

SET provsql.active = on;
SET provsql.where_provenance = on;
SET provsql.update_provenance = on;
SET provsql.last_eval_method = on;
SET provsql.tool_search_path = '/opt/d4:/home/postgres/bin';
SET provsql.aggtoken_text_as_uuid = on;

provsql.tool_search_path 用于外部概率和可视化工具,如 d4c2ddsharpminic2dweightmcgraph-easyprovsql.last_eval_method 存储最后选择的概率评估方法。provsql.aggtoken_text_as_uuid 使聚合标记单元格显示为其证明 UUID;agg_token_value_text(token) 可以恢复这些聚合标记的显示文本。

用户指南单独记录了来源证明助手、更新证明、时间助手,如 get_valid_timetimetraveltimeslicehistoryundo,电路检查助手 circuit_subgraph(root, max_depth)resolve_input(uuid) 以及用于准备助手搜索路径的 setup_search_path()

当前概率和推理界面

从 1.9 到 1.11 的多次发布显著扩展了 SQL 覆盖范围和概率评估:

  • FROM 之外的子查询,包括 EXISTSNOT EXISTSINNOT INANYALL、行值 IN 子查询和 ARRAY(SELECT ...)
  • LEFTRIGHTFULL 外连接,以及修正的 EXCEPTEXCEPT ALL 证明;
  • 遵循 SQL 的聚合处理方法和精确 HAVING 聚合概率,适用于 COUNTSUMMINMAXAVG
  • 通过方法目录和成本选择器进行概率方法的选择,包括 karp-lubystopping-rulesieved-treeprobability_bounds
  • 精确的有界树宽递归可达性、不安全-UCQ 联合宽度编译、安全 UCQ 的 Möbius 反演以及循环递归的吸收证明;
  • 通过 target | evidence 操作符和整个元组的 given()/前缀形式进行条件事件和分布处理;
  • 连续和离散 random_variable 家族,包括正态、伽玛、对数正态、贝塔、威布尔、帕累托、逆伽玛、逆高斯、逻辑斯谛、泊松、二项式、几何、超几何和负二项分布;
  • 分层贝叶斯模型,其中分布参数本身是随机变量,在可用闭合形式时进行共轭后验更新;
  • 随着源数据变化而保持正确的维护证明映射,以及对 NULL 和可为空的随机变量的 SQL 合规 NOT IN 行为。

例如,根据观察到的证据条件化一个连续值并读取后验期望:

WITH model AS (
  SELECT normal(20, 5) AS reading
)
SELECT expected(reading | (reading > 25))
FROM model;

agg_token 类型支持概率聚合表达式的算术、一元负号和比较。使用官方的概率和连续分布章节来选择精确、编译或基于采样的评估方法。

备注

  • 1.11.0 控制文件设置了 default_version = '1.11.0',要求 uuid-ossp,标记扩展为受信任的,并且不可重定位。
  • 上游文档指出 ProvSQL 已在 PostgreSQL 10 至 18 版本上进行了测试。
  • provsql.update_provenance 和多范围半环需要 PostgreSQL 14 或更高版本。
  • 更新证明追踪仍处于实验阶段;启用之前请验证其存储和性能成本。

还应分别验证 NULLEXCEPT 的 SQL 语义是否符合应用预期。