\pset null '(null)' CREATE SERVER fuseki FOREIGN DATA WRAPPER rdf_fdw OPTIONS ( endpoint 'http://fuseki:3030/dt/sparql', update_url 'http://fuseki:3030/dt/update'); CREATE FOREIGN TABLE ft ( subject rdfnode OPTIONS (variable '?s'), predicate rdfnode OPTIONS (variable '?p'), object rdfnode OPTIONS (variable '?o') ) SERVER fuseki OPTIONS ( log_sparql 'true', sparql 'SELECT * WHERE {?s ?p ?o}', sparql_update_pattern '?s ?p ?o .' ); CREATE USER MAPPING FOR postgres SERVER fuseki OPTIONS (user 'admin', password 'secret'); INSERT INTO ft (subject, predicate, object) VALUES ('', '', '"Westfälische Wilhelms-Universität Münster"@de'), ('', '', '"University of Münster"@en'), ('', '', '"Univerrrsity of Münsterrr"@en-US'), ('', '', '"Univêrsity of Münsta"@en-GB'), ('', '', '"18:18:42"^^'), ('', '', '"1780-04-16"^^'), ('', '', '"2025-12-24T18:30:42"^^'), ('', '', '"2025-12-24T13:00:42Z"^^'), ('', '', '"51.9636"^^'), ('', '', '"7.6136"^^'), ('', '', '"Johannes Wessels"'), ('', '', ''), ('', '', ''), ('', '', '"Münster"@de'), ('', '', '"Nordrhein-Westfalen"@de'), ('', '', '"Hello 👋 PostgreSQL 🐘"@en'), ('', '', '"unknown literal type"^^'), ('', '', '"explicit string literal"^^'), ('', '', '""'), ('', '', '". <= pontos => ."@pt'), ('', '', '"\n <= salto de línea => \n"@es'), ('', '', '"\" <= double-quotes => \""@en'), ('', '', '"\t <= Tabulatorzeichen => \t"@de'), ('', '', '"1924"^^'), ('', '', '"49098"^^'), ('', '', '"4956"^^'), ('', '', '"803600000"^^'), ('', '', '"1500.00"^^'), ('', '', '"9999999999999999999"^^'), ('', '', '"0.000000000000001"^^'), ('', '', '"2024-02-29"^^'), ('', '', '"true"^^'); INFO: SPARQL query sent to 'fuseki': INSERT DATA { "Westfälische Wilhelms-Universität Münster"@de }; INSERT DATA { "University of Münster"@en }; INSERT DATA { "Univerrrsity of Münsterrr"@en-US }; INSERT DATA { "Univêrsity of Münsta"@en-GB }; INSERT DATA { "18:18:42"^^ }; INSERT DATA { "1780-04-16"^^ }; INSERT DATA { "2025-12-24T18:30:42"^^ }; INSERT DATA { "2025-12-24T13:00:42Z"^^ }; INSERT DATA { "51.9636"^^ }; INSERT DATA { "7.6136"^^ }; INSERT DATA { "Johannes Wessels" }; INSERT DATA { }; INSERT DATA { }; INSERT DATA { "Münster"@de }; INSERT DATA { "Nordrhein-Westfalen"@de }; INSERT DATA { "Hello 👋 PostgreSQL 🐘"@en }; INSERT DATA { "unknown literal type"^^ }; INSERT DATA { "explicit string literal"^^ }; INSERT DATA { "" }; INSERT DATA { ". <= pontos => ."@pt }; INSERT DATA { "\n <= salto de línea => \n"@es }; INSERT DATA { "\" <= double-quotes => \""@en }; INSERT DATA { "\t <= Tabulatorzeichen => \t"@de }; INSERT DATA { "1924"^^ }; INSERT DATA { "49098"^^ }; INSERT DATA { "4956"^^ }; INSERT DATA { "803600000"^^ }; INSERT DATA { "1500.00"^^ }; INSERT DATA { "9999999999999999999"^^ }; INSERT DATA { "0.000000000000001"^^ }; INSERT DATA { "2024-02-29"^^ }; INSERT DATA { "true"^^ }; /* IRI description */ SELECT subject, predicate, object FROM sparql.describe('fuseki', 'DESCRIBE ') ORDER BY object::text COLLATE "C"; subject | predicate | object -------------------------------+---------------------------------------------------+--------------------------------------------------------------------- | | " <= Tabulatorzeichen => "@de | | " + | | <= salto de línea => + | | "@es | | " <= double-quotes => "@en | | "" | | ". <= pontos => ."@pt | | "0.000000000000001"^^ | | "1500.0e0"^^ | | "1780-04-16"^^ | | "18:18:42"^^ | | "1924"^^ | | "2024-02-29"^^ | | "2025-12-24T13:00:42Z"^^ | | "2025-12-24T18:30:42"^^ | | "49098"^^ | | "4956"^^ | | "51.9636"^^ | | "7.6136"^^ | | "803600000"^^ | | "9999999999999999999"^^ | | "Hello 👋 PostgreSQL 🐘"@en | | "Johannes Wessels" | | "Univerrrsity of Münsterrr"@en-US | | "University of Münster"@en | | "Univêrsity of Münsta"@en-GB | | "Westfälische Wilhelms-Universität Münster"@de | | "explicit string literal" | | "true"^^ | | "unknown literal type"^^ | | | | (30 rows) /* graph pattern description */ SELECT subject, predicate, object FROM sparql.describe('fuseki',' PREFIX dbp: DESCRIBE ?s WHERE { ?s dbp:name ?o . }') WHERE subject = '' ORDER BY object::text COLLATE "C"; subject | predicate | object -------------------------------+---------------------------------------------------+--------------------------------------------------------------------- | | " <= Tabulatorzeichen => "@de | | " + | | <= salto de línea => + | | "@es | | " <= double-quotes => "@en | | "" | | ". <= pontos => ."@pt | | "0.000000000000001"^^ | | "1500.0e0"^^ | | "1780-04-16"^^ | | "18:18:42"^^ | | "1924"^^ | | "2024-02-29"^^ | | "2025-12-24T13:00:42Z"^^ | | "2025-12-24T18:30:42"^^ | | "49098"^^ | | "4956"^^ | | "51.9636"^^ | | "7.6136"^^ | | "803600000"^^ | | "9999999999999999999"^^ | | "Hello 👋 PostgreSQL 🐘"@en | | "Johannes Wessels" | | "Univerrrsity of Münsterrr"@en-US | | "University of Münster"@en | | "Univêrsity of Münsta"@en-GB | | "Westfälische Wilhelms-Universität Münster"@de | | "explicit string literal" | | "true"^^ | | "unknown literal type"^^ | | | | (30 rows) /* IN clause to filter results */ SELECT subject, predicate, object FROM sparql.describe('fuseki', 'DESCRIBE ') WHERE predicate IN ('','') ORDER BY object::text COLLATE "C"; subject | predicate | object -------------------------------+------------------------------------+------------------------------------------------ | | "Univerrrsity of Münsterrr"@en-US | | "University of Münster"@en | | "Univêrsity of Münsta"@en-GB | | "Westfälische Wilhelms-Universität Münster"@de (4 rows) /* using named prefixes and base URI */ SELECT subject, predicate, object FROM sparql.describe( query =>'describe ', server => 'fuseki', base_uri => 'http://test.base.uri/') WHERE predicate = '' ORDER BY object::text COLLATE "C"; subject | predicate | object ---------------------------------------+------------------------------------+-------------- | | "Münster"@de (1 row) /* empty server */ SELECT * FROM sparql.describe('', 'DESCRIBE '); ERROR: SERVER cannot be empty /* empty DESCRIBE pattern */ SELECT * FROM sparql.describe('fuseki', ''); ERROR: DESCRIBE pattern cannot be empty /* empty SERVER and DESCRIBE pattern */ SELECT * FROM sparql.describe('', ''); ERROR: SERVER cannot be empty /* NULL DESCRIBE pattern */ SELECT * FROM sparql.describe('fuseki', NULL); subject | predicate | object ---------+-----------+-------- (0 rows) /* NULL SERVER */ SELECT * FROM sparql.describe(NULL, 'DESCRIBE '); subject | predicate | object ---------+-----------+-------- (0 rows) /* NULL SERVER and DESCRIBE pattern */ SELECT * FROM sparql.describe(NULL, NULL); subject | predicate | object ---------+-----------+-------- (0 rows) /* invalid SERVER */ SELECT * FROM sparql.describe('invalid', 'DESCRIBE '); ERROR: invalid SERVER: invalid SELECT * FROM sparql.describe(' ', 'DESCRIBE '); ERROR: a SERVER cannot contain only whitespace characters /* invalid DESCRIBE pattern */ SELECT * FROM sparql.describe('fuseki', 'invalid'); ERROR: invalid DESCRIBE query: invalid SELECT * FROM sparql.describe('fuseki', ' '); ERROR: a DESCRIBE pattern cannot contain only whitespace characters SELECT * FROM sparql.describe('fuseki', 'DESCRIBE https://www.uni-muenster.de'); -- missing < > ERROR: bad request (HTTP status 400) /* DESCRIBE pattern with a blank node */ SELECT * FROM sparql.describe('fuseki', '_:bnode1'); ERROR: invalid DESCRIBE query: _:bnode1 SELECT * FROM sparql.describe('fuseki', 'DESCRIBE _:bnode1'); ERROR: bad request (HTTP status 400) /* malformed entity IRI */ SELECT * FROM sparql.describe('fuseki', 'DESCRIBE '); subject | predicate | object ---------+-----------+-------- (0 rows) /* SELECT query */ SELECT * FROM sparql.describe('fuseki', 'SELECT ?s ?p ?o WHERE {?s ?p ?o}'); ERROR: invalid DESCRIBE query: SELECT ?s ?p ?o WHERE {?s ?p ?o} /* cleanup */ DELETE FROM ft; INFO: SPARQL query sent to 'fuseki': SELECT ?s ?p ?o {?s ?p ?o} INFO: SPARQL returned 32 records. INFO: SPARQL query sent to 'fuseki': DELETE DATA { "" }; DELETE DATA { "Hello 👋 PostgreSQL 🐘"@en }; DELETE DATA { "unknown literal type"^^ }; DELETE DATA { "explicit string literal" }; DELETE DATA { ". <= pontos => ."@pt }; DELETE DATA { "\n <= salto de línea => \n"@es }; DELETE DATA { "\" <= double-quotes => \""@en }; DELETE DATA { "\t <= Tabulatorzeichen => \t"@de }; DELETE DATA { "Westfälische Wilhelms-Universität Münster"@de }; DELETE DATA { "University of Münster"@en }; DELETE DATA { "Univerrrsity of Münsterrr"@en-US }; DELETE DATA { "Univêrsity of Münsta"@en-GB }; DELETE DATA { "18:18:42"^^ }; DELETE DATA { "1780-04-16"^^ }; DELETE DATA { "2025-12-24T18:30:42"^^ }; DELETE DATA { "2025-12-24T13:00:42Z"^^ }; DELETE DATA { "51.9636"^^ }; DELETE DATA { "7.6136"^^ }; DELETE DATA { "Johannes Wessels" }; DELETE DATA { }; DELETE DATA { }; DELETE DATA { "1924"^^ }; DELETE DATA { "49098"^^ }; DELETE DATA { "4956"^^ }; DELETE DATA { "803600000"^^ }; DELETE DATA { "1500.0e0"^^ }; DELETE DATA { "9999999999999999999"^^ }; DELETE DATA { "0.000000000000001"^^ }; DELETE DATA { "2024-02-29"^^ }; DELETE DATA { "true"^^ }; DELETE DATA { "Nordrhein-Westfalen"@de }; DELETE DATA { "Münster"@de }; DROP SERVER fuseki CASCADE; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to foreign table ft drop cascades to user mapping for postgres on server fuseki