\pset null '(null)' CREATE SERVER virtuoso FOREIGN DATA WRAPPER rdf_fdw OPTIONS ( endpoint 'http://virtuoso:8890/sparql-auth'); CREATE FOREIGN TABLE ft ( subject rdfnode OPTIONS (variable '?s'), predicate rdfnode OPTIONS (variable '?p'), object rdfnode OPTIONS (variable '?o') ) SERVER virtuoso OPTIONS ( log_sparql 'true', sparql 'SELECT * { GRAPH {?s ?p ?o} }', sparql_update_pattern 'GRAPH { ?s ?p ?o . }' ); CREATE USER MAPPING FOR postgres SERVER virtuoso OPTIONS (user 'dba', 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'), ('', '', '"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 'virtuoso': INSERT DATA { GRAPH { "Westfälische Wilhelms-Universität Münster"@de . } }; INSERT DATA { GRAPH { "University of Münster"@en . } }; INSERT DATA { GRAPH { "Univerrrsity of Münsterrr"@en-US . } }; INSERT DATA { GRAPH { "Univêrsity of Münsta"@en-GB . } }; INSERT DATA { GRAPH { "1780-04-16"^^ . } }; INSERT DATA { GRAPH { "2025-12-24T18:30:42"^^ . } }; INSERT DATA { GRAPH { "2025-12-24T13:00:42Z"^^ . } }; INSERT DATA { GRAPH { "51.9636"^^ . } }; INSERT DATA { GRAPH { "7.6136"^^ . } }; INSERT DATA { GRAPH { "Johannes Wessels" . } }; INSERT DATA { GRAPH { . } }; INSERT DATA { GRAPH { . } }; INSERT DATA { GRAPH { "Münster"@de . } }; INSERT DATA { GRAPH { "Nordrhein-Westfalen"@de . } }; INSERT DATA { GRAPH { "Hello 👋 PostgreSQL 🐘"@en . } }; INSERT DATA { GRAPH { "unknown literal type"^^ . } }; INSERT DATA { GRAPH { "explicit string literal"^^ . } }; INSERT DATA { GRAPH { "" . } }; INSERT DATA { GRAPH { ". <= pontos => ."@pt . } }; INSERT DATA { GRAPH { "\n <= salto de línea => \n"@es . } }; INSERT DATA { GRAPH { "\" <= double-quotes => \""@en . } }; INSERT DATA { GRAPH { "\t <= Tabulatorzeichen => \t"@de . } }; INSERT DATA { GRAPH { "1924"^^ . } }; INSERT DATA { GRAPH { "49098"^^ . } }; INSERT DATA { GRAPH { "4956"^^ . } }; INSERT DATA { GRAPH { "803600000"^^ . } }; INSERT DATA { GRAPH { "1500.00"^^ . } }; INSERT DATA { GRAPH { "9999999999999999999"^^ . } }; INSERT DATA { GRAPH { "0.000000000000001"^^ . } }; INSERT DATA { GRAPH { "2024-02-29"^^ . } }; INSERT DATA { GRAPH { "true"^^ . } }; /* IRI description */ SELECT subject, predicate, object FROM sparql.describe('virtuoso', 'DESCRIBE FROM ') ORDER BY object::text COLLATE "C"; subject | predicate | object -------------------------------+---------------------------------------------------+---------------------------------------------------------------------- | | " <= Tabulatorzeichen => "@de | | " + | | <= salto de línea => + | | "@es | | " <= double-quotes => "@en | | "" | | ". <= pontos => ."@pt | | "0.000000000000001"^^ | | "1500.0"^^ | | "1780-04-16"^^ | | "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"^^ | | | | (29 rows) /* graph pattern description */ SELECT subject, predicate, object FROM sparql.describe('virtuoso',' PREFIX dbp: DESCRIBE ?s FROM 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.0"^^ | | "1780-04-16"^^ | | "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"^^ | | | | (29 rows) /* IN clause to filter results */ SELECT subject, predicate, object FROM sparql.describe('virtuoso', 'DESCRIBE FROM ') 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 FROM ', server => 'virtuoso', 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('virtuoso', ''); 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('virtuoso', 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('virtuoso', 'invalid'); ERROR: invalid DESCRIBE query: invalid SELECT * FROM sparql.describe('virtuoso', ' '); ERROR: a DESCRIBE pattern cannot contain only whitespace characters SELECT * FROM sparql.describe('virtuoso', 'DESCRIBE https://www.uni-muenster.de'); -- missing < > ERROR: bad request on server "virtuoso" (HTTP 400) DETAIL: Virtuoso 37000 Error SP030: SPARQL compiler, line 2: Undefined namespace prefix at 'https' before '/' SPARQL query: define sql:big-data-const 0 DESCRIBE https://www.uni-muenster.de HINT: Check the SPARQL query syntax. /* DESCRIBE pattern with a blank node */ SELECT * FROM sparql.describe('virtuoso', '_:bnode1'); ERROR: invalid DESCRIBE query: _:bnode1 SELECT * FROM sparql.describe('virtuoso', 'DESCRIBE _:bnode1'); ERROR: bad request on server "virtuoso" (HTTP 400) DETAIL: Virtuoso 37000 Error SP030: SPARQL compiler, line 2: syntax error at '_:bnode1' before '}' SPARQL query: define sql:big-data-const 0 DESCRIBE _:bnode1 HINT: Check the SPARQL query syntax. /* malformed entity IRI */ SELECT * FROM sparql.describe('virtuoso', 'DESCRIBE '); subject | predicate | object ---------+-----------+-------- (0 rows) /* SELECT query */ SELECT * FROM sparql.describe('virtuoso', '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 'virtuoso': SELECT ?s ?p ?o { GRAPH {?s ?p ?o} } INFO: SPARQL returned 31 records. INFO: SPARQL query sent to 'virtuoso': DELETE DATA { GRAPH { "" . } }; DELETE DATA { GRAPH { "Hello 👋 PostgreSQL 🐘"@en . } }; DELETE DATA { GRAPH { "unknown literal type"^^ . } }; DELETE DATA { GRAPH { "explicit string literal"^^ . } }; DELETE DATA { GRAPH { ". <= pontos => ."@pt . } }; DELETE DATA { GRAPH { "\n <= salto de línea => \n"@es . } }; DELETE DATA { GRAPH { "\" <= double-quotes => \""@en . } }; DELETE DATA { GRAPH { "\t <= Tabulatorzeichen => \t"@de . } }; DELETE DATA { GRAPH { "Westfälische Wilhelms-Universität Münster"@de . } }; DELETE DATA { GRAPH { "University of Münster"@en . } }; DELETE DATA { GRAPH { "Univerrrsity of Münsterrr"@en-us . } }; DELETE DATA { GRAPH { "Univêrsity of Münsta"@en-gb . } }; DELETE DATA { GRAPH { "Münster"@de . } }; DELETE DATA { GRAPH { "Nordrhein-Westfalen"@de . } }; DELETE DATA { GRAPH { "1780-04-16"^^ . } }; DELETE DATA { GRAPH { "2025-12-24T18:30:42"^^ . } }; DELETE DATA { GRAPH { "2025-12-24T13:00:42Z"^^ . } }; DELETE DATA { GRAPH { "51.9636"^^ . } }; DELETE DATA { GRAPH { "7.6136"^^ . } }; DELETE DATA { GRAPH { "Johannes Wessels" . } }; DELETE DATA { GRAPH { . } }; DELETE DATA { GRAPH { . } }; DELETE DATA { GRAPH { "1924"^^ . } }; DELETE DATA { GRAPH { "49098"^^ . } }; DELETE DATA { GRAPH { "4956"^^ . } }; DELETE DATA { GRAPH { "803600000"^^ . } }; DELETE DATA { GRAPH { "1500.0"^^ . } }; DELETE DATA { GRAPH { "9999999999999999999"^^ . } }; DELETE DATA { GRAPH { "0.000000000000001"^^ . } }; DELETE DATA { GRAPH { "2024-02-29"^^ . } }; DELETE DATA { GRAPH { "true"^^ . } }; DROP SERVER virtuoso CASCADE; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to foreign table ft drop cascades to user mapping for postgres on server virtuoso