rdf_fdw
rdf_fdw : Foreign data wrapper for RDF triplestores over SPARQL endpoints
Overview
| ID | Extension | Package | Version | Category | License | Language |
|---|---|---|---|---|---|---|
| 8760 | rdf_fdw
|
rdf_fdw
|
2.6.0 |
FDW
|
MIT
|
C
|
| Attribute | Has Binary | Has Library | Need Load | Has DDL | Relocatable | Trusted |
|---|---|---|---|---|---|---|
--s-d-r
|
No
|
Yes
|
No
|
Yes
|
yes
|
no
|
| Relationships | |
|---|---|
| See Also | wrappers
multicorn
postgres_fdw
sparql
|
Packages
| Type | Repo | Version | PG Major Compatibility | Package Pattern | Dependencies |
|---|---|---|---|---|---|
| EXT | PIGSTY
|
2.6.0 |
18
17
16
15
14
|
rdf_fdw |
- |
| RPM | PIGSTY
|
2.6.0 |
18
17
16
15
14
|
rdf_fdw_$v |
- |
| DEB | PIGSTY
|
2.6.0 |
18
17
16
15
14
|
postgresql-$v-rdf-fdw |
- |
| Linux / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
el8.x86_64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
el8.aarch64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
el9.x86_64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
el9.aarch64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
el10.x86_64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
el10.aarch64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
d12.x86_64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
d12.aarch64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
d13.x86_64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
d13.aarch64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
u22.x86_64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
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
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
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
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
u26.aarch64
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
PIGSTY 2.6.0
|
Source
pig build pkg rdf_fdw; # build rpm/debInstall
Make sure PGDG and PIGSTY repo available:
pig repo add pgsql -u # add both repo and update cacheInstall this extension with pig:
pig install rdf_fdw; # install via package name, for the active PG version
pig install rdf_fdw -v 18; # install for PG 18
pig install rdf_fdw -v 17; # install for PG 17
pig install rdf_fdw -v 16; # install for PG 16
pig install rdf_fdw -v 15; # install for PG 15
pig install rdf_fdw -v 14; # install for PG 14Create this extension with:
CREATE EXTENSION rdf_fdw;Usage
Sources:
rdf_fdw is a PostgreSQL foreign data wrapper for querying RDF triplestores over SPARQL endpoints. It exposes SPARQL result variables as foreign-table columns, supports pushdown for common SQL clauses, includes a native rdfnode type for RDF terms, provides SPARQL 1.1 helper functions, and can perform SPARQL INSERT, UPDATE, and DELETE through writable foreign tables.
v2.6.0 adds Bearer-token authentication through USER MAPPING, a max_response_size server option to cap HTTP response bodies, BCE date/timestamp cast handling, and many rdfnode parser/comparison fixes. v2.5 added request_timeout and readonly options.
Create the Extension
CREATE EXTENSION IF NOT EXISTS rdf_fdw;
SELECT rdf_fdw_version();
SELECT * FROM rdf_fdw_settings();To install or update to the exact SQL version:
CREATE EXTENSION rdf_fdw WITH VERSION '2.6';
ALTER EXTENSION rdf_fdw UPDATE TO '2.6';Register a 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'
);Useful server options include:
endpoint: SPARQL endpoint URL; required.batch_size: number of rows per SPARQL UPDATE batch.enable_pushdown: enables SQL-to-SPARQL pushdown.format: expected SPARQL result MIME type.http_proxy: proxy URL; proxy credentials belong inUSER MAPPING.connect_timeout: connection timeout.request_timeout: complete HTTP request timeout.max_response_size: maximum response body size in bytes;0means unlimited.readonly: preventsINSERT,UPDATE, andDELETEbefore requests reach the endpoint.request_redirectandrequest_max_redirect: redirect behavior.
Use max_response_size for public or untrusted endpoints because rdf_fdw loads retrieved RDF data into memory before converting it for PostgreSQL.
User Mapping
CREATE USER MAPPING FOR postgres
SERVER dbpedia
OPTIONS (
user 'sparql_user',
password 'secret'
);v2.6.0 adds Bearer-token authentication:
CREATE USER MAPPING FOR postgres
SERVER dbpedia
OPTIONS (
token 'eyJhbGciOi...'
);Proxy credentials are also USER MAPPING options:
CREATE USER MAPPING FOR app_user
SERVER dbpedia
OPTIONS (
proxy_user 'proxy-user',
proxy_password 'proxy-secret'
);Foreign Tables with rdfnode Columns
Declare foreign-table columns as rdfnode to preserve RDF terms, IRIs, blank nodes, language tags, and XSD datatypes.
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')
}
$$
);Native PostgreSQL column types are deprecated for RDF values in v2.6.0. Existing native-typed tables continue to work, but they emit warnings and lose RDF term details.
Querying and Pushdown
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 can push down WHERE, LIMIT, ORDER BY, DISTINCT, and supported comparisons/functions. Use EXPLAIN VERBOSE to inspect the generated remote SPARQL.
Prefix Management
rdf_fdw provides catalog tables and helper functions under the sparql schema for reusable SPARQL prefixes:
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#');Data Modification
Writable foreign tables can translate PostgreSQL INSERT, UPDATE, and DELETE into SPARQL UPDATE requests when the foreign table has the required SPARQL update pattern.
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
);Use readonly = true at the server or table level when an endpoint should never receive writes.
Clone a Foreign Table
CALL rdf_fdw_clone_table(
foreign_table := 'dbpedia_films',
target_table := 'dbpedia_films_local',
fetch_size := 1000,
create_table := true
);rdf_fdw_clone_table() copies data from a foreign table into a local table in batches. v2.5 fixed several round-trip issues for RDF terms during cloning.
SPARQL Functions
The sparql schema implements many SPARQL 1.1 functions and aggregates, including:
- aggregates such as
sparql.sum,sparql.avg,sparql.min,sparql.max,sparql.group_concat, andsparql.sample - RDF term helpers such as
sparql.isiri,sparql.isblank,sparql.isliteral,sparql.datatype,sparql.iri,sparql.strdt, andsparql.strlang - string functions such as
sparql.strlen,sparql.substr,sparql.ucase,sparql.lcase,sparql.contains, andsparql.replace - numeric, date/time, hash, and custom convenience functions
Caveats
- PostgreSQL 9.5+ is the upstream baseline, but Pigsty packages target modern PostgreSQL majors listed in local metadata.
- Retrieved RDF data is accumulated in memory before conversion. Set
max_response_size, useLIMIT, and keep remote result sets bounded. - Prefer
rdfnodecolumns. Native PostgreSQL typed columns are deprecated for RDF terms and will lose IRI/language/datatype information. - Store secrets in
USER MAPPING; do not put proxy credentials or endpoint tokens intoSERVERoptions. - Public SPARQL endpoints can be slow or rate-limited. Use
connect_timeout,request_timeout, retries, and local materialization when needed.