rdf_fdw

通过 SPARQL 端点访问 RDF 三元组存储的 FDW

概览

扩展包名版本分类许可证语言
rdf_fdw2.6.0FDWMITC
ID扩展名BinLibLoadCreateTrustReloc模式
8760rdf_fdw-
相关扩展wrappers multicorn postgres_fdw sparql

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.6.01817161514rdf_fdw-
RPMPIGSTY2.6.01817161514rdf_fdw_$v-
DEBPIGSTY2.6.01817161514postgresql-$v-rdf-fdw-
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
u22.x86_64
u22.aarch64
PIGSTY 2.6.0
PIGSTY 2.6.0
PIGSTY 2.6.0
PIGSTY 2.6.0
PIGSTY 2.6.0
u24.x86_64
u24.aarch64
PIGSTY 2.6.0
PIGSTY 2.6.0
PIGSTY 2.6.0
PIGSTY 2.6.0
PIGSTY 2.6.0
u26.x86_64
u26.aarch64

构建

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

pig build pkg rdf_fdw         # 构建 RPM / DEB 包

安装

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

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

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

pig install rdf_fdw;          # 当前活跃 PG 版本安装
pig ext install -y rdf_fdw -v 18  # PG 18
pig ext install -y rdf_fdw -v 17  # PG 17
pig ext install -y rdf_fdw -v 16  # PG 16
pig ext install -y rdf_fdw -v 15  # PG 15
pig ext install -y rdf_fdw -v 14  # PG 14
dnf install -y rdf_fdw_18       # PG 18
dnf install -y rdf_fdw_17       # PG 17
dnf install -y rdf_fdw_16       # PG 16
dnf install -y rdf_fdw_15       # PG 15
dnf install -y rdf_fdw_14       # PG 14
apt install -y postgresql-18-rdf-fdw   # PG 18
apt install -y postgresql-17-rdf-fdw   # PG 17
apt install -y postgresql-16-rdf-fdw   # PG 16
apt install -y postgresql-15-rdf-fdw   # PG 15
apt install -y postgresql-14-rdf-fdw   # PG 14

创建扩展

CREATE EXTENSION rdf_fdw;

用法

来源:

rdf_fdw 是通过 SPARQL endpoint 查询 RDF triplestore 的 PostgreSQL foreign data wrapper。它把 SPARQL 结果变量暴露为外部表列,支持常见 SQL 子句下推,提供用于 RDF term 的原生 rdfnode 类型,实现了多种 SPARQL 1.1 辅助函数,并可通过可写外部表执行 SPARQL INSERTUPDATEDELETE

v2.6.0 增加了通过 USER MAPPING 配置 Bearer token 认证、用于限制 HTTP 响应体大小的 max_response_size server option、BCE date/timestamp cast 支持,以及大量 rdfnode 解析和比较修复。v2.5 增加了 request_timeoutreadonly 选项。

创建扩展

CREATE EXTENSION IF NOT EXISTS rdf_fdw;

SELECT rdf_fdw_version();
SELECT * FROM rdf_fdw_settings();

安装或升级到指定 SQL 版本:

CREATE EXTENSION rdf_fdw WITH VERSION '2.6';
ALTER EXTENSION rdf_fdw UPDATE TO '2.6';

注册 SPARQL Endpoint

CREATE SERVER dbpedia
FOREIGN DATA WRAPPER rdf_fdw
OPTIONS (
  endpoint          'https://dbpedia.org/sparql',
  enable_pushdown   'true',
  request_timeout   '60',
  max_response_size '104857600',
  readonly          'true'
);

常用 server options:

  • endpoint:SPARQL endpoint URL,必需。
  • batch_size:每批 SPARQL UPDATE 的行数。
  • enable_pushdown:启用 SQL 到 SPARQL 的下推。
  • format:期望的 SPARQL 结果 MIME 类型。
  • http_proxy:代理 URL;代理凭据应放在 USER MAPPING
  • connect_timeout:连接超时。
  • request_timeout:完整 HTTP 请求超时。
  • max_response_size:最大响应体字节数;0 表示不限制。
  • readonly:在请求到达 endpoint 前阻止 INSERTUPDATEDELETE
  • request_redirectrequest_max_redirect:重定向行为。

连接公共或不可信 endpoint 时建议设置 max_response_size,因为 rdf_fdw 会先把取回的 RDF 数据载入内存,再转换为 PostgreSQL 表示。

用户映射

CREATE USER MAPPING FOR postgres
SERVER dbpedia
OPTIONS (
  user 'sparql_user',
  password 'secret'
);

v2.6.0 增加了 Bearer token 认证:

CREATE USER MAPPING FOR postgres
SERVER dbpedia
OPTIONS (
  token 'eyJhbGciOi...'
);

代理凭据也应放在 USER MAPPING

CREATE USER MAPPING FOR app_user
SERVER dbpedia
OPTIONS (
  proxy_user 'proxy-user',
  proxy_password 'proxy-secret'
);

使用 rdfnode 列的外部表

外部表列应声明为 rdfnode,以保留 RDF term、IRI、blank node、语言标签和 XSD datatype。

CREATE FOREIGN TABLE dbpedia_films (
  film rdfnode OPTIONS (variable '?film'),
  name rdfnode OPTIONS (variable '?name'),
  year rdfnode OPTIONS (variable '?year')
)
SERVER dbpedia
OPTIONS (
  sparql $$
    SELECT ?film ?name ?year
    WHERE {
      ?film a dbo:Film ;
            rdfs:label ?name ;
            dbo:releaseDate ?year .
      FILTER (lang(?name) = 'en')
    }
  $$
);

v2.6.0 中,RDF 值使用原生 PostgreSQL 列类型的方式已被弃用。已有 native-typed 表仍可工作,但会发出 warning,并且会丢失 RDF term 细节。

查询与下推

SELECT film, sparql.lex(name) AS title
FROM dbpedia_films
WHERE name = '"The Matrix"@en'::rdfnode
ORDER BY year
LIMIT 10;

EXPLAIN (VERBOSE, COSTS OFF)
SELECT *
FROM dbpedia_films
WHERE film = '<http://dbpedia.org/resource/The_Matrix>'::rdfnode;

rdf_fdw 可下推 WHERELIMITORDER BYDISTINCT 以及受支持的比较和函数。使用 EXPLAIN VERBOSE 查看生成的远端 SPARQL。

Prefix 管理

rdf_fdwsparql schema 下提供 catalog 表和辅助函数,用于复用 SPARQL prefix:

SELECT sparql.add_context('default', 'Default SPARQL prefix context');
SELECT sparql.add_prefix('default', 'rdf',  'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
SELECT sparql.add_prefix('default', 'rdfs', 'http://www.w3.org/2000/01/rdf-schema#');
SELECT sparql.add_prefix('default', 'xsd',  'http://www.w3.org/2001/XMLSchema#');

数据修改

当外部表具备所需 SPARQL update pattern 时,可写外部表可以把 PostgreSQL INSERTUPDATEDELETE 翻译为 SPARQL UPDATE 请求。

ALTER FOREIGN TABLE dbpedia_films OPTIONS (ADD readonly 'false');

INSERT INTO dbpedia_films(film, name)
VALUES (
  '<http://example.org/film/1>'::rdfnode,
  '"Example Film"@en'::rdfnode
);

如果 endpoint 不应接收写请求,应在 server 或 table 级别设置 readonly = true

克隆外部表

CALL rdf_fdw_clone_table(
  foreign_table := 'dbpedia_films',
  target_table  := 'dbpedia_films_local',
  fetch_size    := 1000,
  create_table  := true
);

rdf_fdw_clone_table() 会把外部表数据分批复制成本地表。v2.5 修复了克隆 RDF term 时的多项往返问题。

SPARQL 函数

sparql schema 实现了许多 SPARQL 1.1 函数和聚合,包括:

  • sparql.sumsparql.avgsparql.minsparql.maxsparql.group_concatsparql.sample 等聚合
  • sparql.isirisparql.isblanksparql.isliteralsparql.datatypesparql.irisparql.strdtsparql.strlang 等 RDF term 函数
  • sparql.strlensparql.substrsparql.ucasesparql.lcasesparql.containssparql.replace 等字符串函数
  • 数值、日期时间、哈希和其他便利函数

注意事项

  • 上游最低基线为 PostgreSQL 9.5+;Pigsty 包则面向本地元数据中列出的现代 PostgreSQL 大版本。
  • 取回的 RDF 数据会在转换前累积到内存中。应设置 max_response_size、使用 LIMIT,并限制远端结果集规模。
  • 优先使用 rdfnode 列。RDF term 使用 PostgreSQL 原生类型已被弃用,并会丢失 IRI、语言和 datatype 信息。
  • 密钥应放在 USER MAPPING;不要把代理凭据或 endpoint token 写进 SERVER options。
  • 公共 SPARQL endpoint 可能慢或有速率限制。需要时使用 connect_timeoutrequest_timeout、重试和本地物化。

最后修改 2026-07-02: extension update 2026-07-02 (d4da20c)