Skip to content
Live on demo.openlinksw.com · No sign-up needed for SPARQL

Your SQL tables, answering as a knowledge graph.Without moving a single row.

Virtuoso gives every row in any ODBC- or JDBC-accessible DBMS its own hyperlink, which works as a cross-platform super-key. You can then ask the same data questions in SQL, in SPARQL, or in both at once, and an OPAL agent can answer them in plain English. Nothing on this page is a screenshot: every example runs against live servers as you read. The showcases use Microsoft SQL Server, PostgreSQL, Databricks and native Virtuoso SQL tables as examples, plus a Snowflake-style warehouse estate.

Run a live query
…
Northwind order lines
…
Orders
…
Customers
…
Products
…
Entity types
Counting the live Northwind RDF View on demo.openlinksw.com…

Works with the databases, files and web sources you already have

How it works

Three steps from any ODBC or JDBC database to a knowledge graph

Attach

Connect Virtuoso to any DBMS it can reach over ODBC or JDBC; the showcases use Microsoft SQL Server, PostgreSQL and Databricks alongside native Virtuoso SQL tables as examples. The tables appear inside Virtuoso, for example "sqlserver"."northwind"."customers", and the data stays where it is.

Map

An RDF View gives each row a hyperlink of its own, such as …/customers/CustomerID/ALFKI#this, and turns each foreign key into a link you can follow. That hyperlink is a super-key that works on any platform able to follow a link.

Query or ask

Use SQL, SPASQL or SPARQL, browse by facets, or put the question to an OPAL agent. Every IRI also opens a page that describes it.

Why it matters

Three facts worth knowing before you choose

Fact 1

Nothing is copied

Each SPARQL query here is translated into SQL and run against the source tables at that moment. When a row changes in the source database, the next answer changes with it. There is no export to schedule and no copy to drift.

See it on Northwind →
Fact 2

Every row's hyperlink is a cross-platform super-key

Each customer, order and product gets a hyperlink that opens a page describing it. Unlike a primary key, it keeps its meaning outside its own database, so rows in two different databases, or a row and a web page, can be joined by reference instead of by file transfer.

See sponged entity links →
Fact 3

Answers come from queries, not from a stored copy

An OPAL agent builds its answer from a query you can inspect. When a number looks wrong, you can see exactly where it came from.

Talk to an agent →
Access control

Your data stays where it lives. So do the rules.

Access is decided by attribute-based (ABAC) ACLs on the server, not by the page. On the demo instance anyone may run SPARQL; SQL, SPASQL and fresh sponging need a sign-in. Identity can come from WebID-TLS, OAuth or OpenID Connect through the Virtuoso Authentication Layer.

AnonymousSPARQL over RDF Views and cached Sponger graphs
Signed in (demo / demo or vdb / vdb)SQL over XMLA and SPASQL in the Query Builder
Signed in (URIBurner)Sponging new or stale URLs
FAQ

The questions people ask first

Run your first query. Most answer in under a second.

Most Northwind queries on this page answer in under a second. Run one, then ask an OPAL agent the same question in plain English and compare the two.

RDF Views playground

The same tables, asked three ways

Each tab is a data source exposed through a Virtuoso RDF View (any DBMS reachable over ODBC or JDBC qualifies); the showcases use native Virtuoso SQL tables, Microsoft SQL Server, PostgreSQL and Databricks as examples, plus a synthetic Snowflake-style warehouse estate and CSV files, all on demo.openlinksw.com. SPARQL runs right here, and you can edit any query before you run it. SQL and SPASQL open in the SPASQL Query Builder, which sends them to Virtuoso over XMLA.

Pick a database, then a language

Query language
Virtuoso Sponger

Point it at a web page. Get back a graph.

The Sponger is Virtuoso's Linked Data middleware. Its cartridges read a web resource (an HTML page, an RSS feed, a GitHub repository, an X profile), produce RDF, and store it in a named graph whose IRI is the source URL. On URIBurner, a query names that graph with FROM <url> and adds DEFINE get:soft "replace" to fetch or refresh it.

Two sources. The first four examples query the graph the Sponger built from Techmeme's RSS feed; the last queries the graph it built from the ai-agent-skills GitHub repository. Each graph is named by its source URL. How they run: Fetching a new or stale URL needs a signed-in session on URIBurner, so each card runs anonymously against the graph the Sponger already built, and offers a Re-sponge link that adds DEFINE get:soft "replace" and opens URIBurner's authenticated endpoint.

Five live examples from two sources

Sponge any URL

Try it on a page of your own

Enter a URL. You get a description page, a Data Twingler-style type profile you can run now (it returns rows if URIBurner already holds that graph), and the authenticated refresh query.

Faceted browsing

See what is in a dataset before you write a query

Pick a demo dataset. The page runs the standard explore query against that dataset's named graph only: one row per entity type, with a sample entity and a count. Each type then opens in the SPARQL Faceted Browser, a single-page app in the style of Virtuoso's FCT service, whose links were built with the sparql-faceted-browser skill's link builder.

Run the explore query on one dataset

SPARQL · explore

Open in endpoint ↗
Starting points

Open this dataset in the faceted browser

One link per entity type in the selected dataset, plus a pivot and an entity description where the dataset has them.

OPAL · OpenLink AI Layer

An assistant that answers from live queries

OPAL connects LLMs to databases, knowledge graphs, filesystems and APIs. An agent is a set of instructions plus a list of query functions. The model picks a function, Virtuoso runs a predefined SQL, SPARQL or SPASQL query, and the answer is built from what comes back. Because the agent and the data are only loosely coupled, you can change the model or the Data Space without rewriting the agent.

Full OPAL chat UI

How a question becomes an answer

After the OPAL widget architecture diagram.

1Usertypes a prompt
2opal.jssends it over a WebSocket
3Virtuososelects a function handler
4Predefined querySQL, SPARQL or SPASQL
5Knowledge graphwith reasoning & inference
6Answerstreamed back to the chat
Live catalog

Agents published on URIBurner

Read live from URIBurner's A2A Agent Card. Agents with a “Chat here” button can be used in the chat panel on this page.

Loading the Agent Card…
Questions to try

Ask about the data on this site

How the chat connects. The panel uses the same OPAL widget, key and settings as virtuoso.openlinksw.com: its auth.js client carries the public widget key that virtuoso.openlinksw.com (Virtuoso Support Agent) or uda.openlinksw.com (ODBC & JDBC Support Agent) uses for that agent, so there is nothing to sign in to.

Widget usage

The same widget as virtuoso.openlinksw.com

The chat panel on this page is driven by the OPAL widget scripts served from virtuoso.openlinksw.com. This is the initialisation that site uses:

The module picks the agent configuration and functions lists the query functions it may call. The panel here swaps module when you choose a different agent. A site of your own should register its own key at URIBurner's OAuth applications page rather than reuse this one.

Other ways to reach the same agents

MCP

The same functions, exposed as Model Context Protocol tools.

https://linkeddata.uriburner.com/chat/mcp/messages
https://linkeddata.uriburner.com/chat/mcp/sse

MCP setup →

A2A

Agent-to-agent tasks over JSON-RPC, discovered from the Agent Card.

/.well-known/agent.json

OpenAPI

Chat and function endpoints described for any HTTP client.

Chat API · Functions API

A shared OPAL session from the Northwind Sales Performance Dashboard post: open the Northwind chat transcript.

Ontology generation

Ontologies generated from your SQL schema, then reused with shared ones

An RDF View is two things: the mapping that turns rows into entities, and an ontology that describes them. Virtuoso generates both from the database schema, on the fly, for any ODBC- or JDBC-accessible DBMS. Every class and property gets its own IRI, so the ontology is itself linked data you can query, describe and extend.

What gets generated

Table

becomes a class

Demo.demo.Products becomes …/schemas/Northwind/Products, labelled with its source table.

Column

becomes a typed property

UnitPrice becomes an owl:DatatypeProperty with domain Products and range xsd:numeric.

Foreign key

becomes a link

Products → Categories becomes the owl:ObjectProperty has_categories, so joins become paths you follow.

Alignment

connects it to shared ontologies

One rdfs:subClassOf or owl:equivalentClass statement ties a generated class to FOAF, schema.org or DBpedia.

See it on the live server

Each query below runs against demo.openlinksw.com. The first three read the generated ontologies; the last three show them aligned with, and answering in, shared vocabularies.

Generate one for your own database

Attach and generate

Link the tables over ODBC or JDBC, then generate the RDF View. Virtuoso writes the ontology (TBox), the instance mapping (ABox) and the rewrite rules that make each IRI resolve.

Align

State how your classes relate to shared ones (rdfs:subClassOf, owl:equivalentClass, owl:equivalentProperty), in a few triples kept beside the generated ontology.

Query in any vocabulary

Ask in your own terms or in the shared ones. Apply the alignment in the query, as the last example does, or let Virtuoso's inference rules do it.

Agent skills that automate these steps: virtuoso-support-agent (RDF View generation) and linked-data-skills (RDF Views from database objects).

Sources

Where every example comes from

Queries, graph IRIs and links were taken from these posts and checked against the live endpoints.