# Virtuoso SPARQL Document Generation & Cloud Storage Access Control

> [HTML Infographic](virtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.html) | [RDF Turtle](../rdf/virtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.ttl) | [JSON-LD](../rdf/virtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.jsonld)

A meshup of two Virtuoso blog articles: (1) using SPARQL DESCRIBE, CONSTRUCT, and SELECT queries to dynamically generate documents in multiple formats for follow-your-nose exploration, and (2) using ODS-Briefcase with WebID-based ACLs to mediate fine-grained access to resources stored in Google Drive, Dropbox, Microsoft OneDrive, Box, and Amazon S3.

By [Kingsley Uyi Idehen](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fkidehen%23this) & [Ted Thibodeau Jr](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fwww.linkedin.com%2Fin%2Ftedthibodeau%23this) | OpenLink Virtuoso Weblog | 2016-04-25

---

## Overview

Virtuoso SPARQL queries produce dynamic documents in HTML, CSV, JSON, XML, Turtle, JSON-LD, and RDF/XML. ODS-Briefcase mounts third-party cloud storage as WebDAV DET folders with WebID-based ACLs, enabling granular access control independent of the provider's native permissions.

**Key Stats:**
- **7+** SPARQL Result Formats (HTML, CSV, JSON, XML, Turtle, JSON-LD, RDF/XML)
- **5** Cloud Services Supported (Google Drive, Dropbox, OneDrive, Box, Amazon S3)
- **10** FAQ Questions covering SPARQL, ODS-Briefcase, WebID, ACLs, and Sponger
- **12** Glossary Terms (SPARQL, WebID, WebDAV, DET, Named Graph, and more)

---

## SPARQL Document Generation

Virtuoso SPARQL queries dynamically generate documents in multiple formats for follow-your-nose exploration of data access drivers and product portfolios.

### DESCRIBE/CONSTRUCT Result Types

SPARQL DESCRIBE and CONSTRUCT queries produce RDF statement graphs in:
- **RDF-Turtle** (`text/turtle`)
- **RDF N-Triples** (`application/n-triples`)
- **JSON-LD** (`application/ld+json`)
- **RDF/XML** (`application/rdf+xml`)

### SELECT Result Types

SELECT queries return tabular solutions in:
- **HTML** (`text/html`)
- **HTML with Faceted Browsing Links** (`text/x-html+tr`)
- **CSV** (`text/csv`)
- **SPARQL Results JSON** (`application/sparql-results+json`)
- **SPARQL Results XML** (`application/sparql-results+xml`)
- **Microsoft Excel** (`application/vnd.ms-excel`)
- **JavaScript** (`application/javascript`)

### HTTP Content Negotiation

Virtuoso SPARQL endpoints support HTTP content negotiation for result format selection via Accept headers, though browser support beyond `text/html` is limited.

### Structured Data Islands

HTML documents can embed SPARQL DESCRIBE results as structured data islands using `<script>` tags in JSON-LD, HTML5 Microdata, RDFa, or HTML+Turtle formats.

---

## Cloud Storage Access Control via ODS-Briefcase

ODS-Briefcase mounts third-party cloud storage as WebDAV DET folders with WebID-based ACLs, enabling fine-grained access control independent of provider permissions.

### Supported Cloud Services

| Service | Default Free Storage | API Limit |
|---------|---------------------|-----------|
| [Google Drive](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23googleDriveService) | 15GB | 500,000 requests/day |
| [Dropbox](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23dropboxService) | 2GB | 5 users per app (default) |
| [Microsoft OneDrive](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23oneDriveService) | 5GB | — |
| [Box](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23boxService) | — | — |
| [Amazon S3](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23amazonS3Service) | Pay-as-you-go | — |

### WebID Authentication

[Virtuoso VAL](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23webidAuthentication) (Virtuoso Authentication Layer) supports decentralized identity verification using WebIDs from LinkedIn, Twitter, Facebook, WordPress, Yahoo, Mozilla Persona, and other providers.

### ACL Configuration

WebID-based ACLs can be applied at folder, sub-folder, or individual document level, granting READ or WRITE access to specific agents or agent classes. ACLs can be configured via the ODS UI or the RESTful ACL API using Turtle.

### Virtuoso Sponger Integration

ODS-Briefcase folders can enable the [Virtuoso Sponger](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23spongerIntegration) to extract RDF from files using Extractor and Meta Cartridges, saving results to named graphs.

---

## Technologies & Standards

| Technology | Description |
|------------|-------------|
| [SPARQL](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23sparqlTech) | W3C standard query language for RDF |
| [WebDAV](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23webdavTech) | HTTP extension for collaborative file management (RFC 4918) |
| [WebID](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23webidTech) | Decentralized identification protocol using HTTP URIs and RDF profiles |
| [OpenLink Virtuoso](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23virtuosoTech) | Multi-model data management platform |

---

## FAQ

### [What document formats can Virtuoso SPARQL DESCRIBE queries produce?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q1)

SPARQL DESCRIBE and CONSTRUCT queries in Virtuoso can produce results in RDF-Turtle (text/turtle), RDF N-Triples (application/n-triples), JSON-LD (application/ld+json), and RDF/XML (application/rdf+xml) formats.

### [What result formats are available for SPARQL SELECT queries in Virtuoso?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q2)

SELECT queries return results as HTML (text/html), HTML with Faceted Browsing Links (text/x-html+tr), CSV (text/csv), SPARQL Results JSON (application/sparql-results+json), SPARQL Results XML (application/sparql-results+xml), Microsoft Excel (application/vnd.ms-excel), and JavaScript (application/javascript) formats.

### [What is ODS-Briefcase?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q3)

ODS-Briefcase (formerly ODrive) is a personal data space manager within the OpenLink Data Spaces framework. It provides WebDAV-based mount points for both local Virtuoso DAV storage and third-party cloud storage services like Google Drive, Dropbox, OneDrive, Box, and Amazon S3.

### [How does ODS-Briefcase control access to cloud storage files?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q4)

ODS-Briefcase uses WebID-based ACLs (Access Control Lists) to grant READ or WRITE access to specific individuals or groups. ACLs can be applied at the folder level, sub-folder level, or individual document level, independent of the cloud provider's native permissions model.

### [What is a WebID?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q5)

A WebID is an HTTP URI that identifies a person or agent, with an associated RDF profile document describing their attributes. Virtuoso VAL supports WebIDs from LinkedIn, Twitter, Facebook, WordPress, Yahoo, Mozilla Persona, and other identity providers for decentralized authentication.

### [What is a Dynamic Extension Type (DET) in Virtuoso?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q6)

A DET is a Virtuoso mechanism that generates dynamic hypermedia resources from queries, exposed as files in WebDAV folders. It functions like a materialized view — the content is generated at request time rather than stored statically. Cloud storage mounts in ODS-Briefcase are implemented as DETs.

### [What is the Virtuoso Sponger?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q7)

The Virtuoso Sponger is RDF transformation middleware that extracts structured data from various document formats (Office documents, spreadsheets, presentations, etc.) using Extractor Cartridges and Meta Cartridges. When enabled on an ODS-Briefcase folder, it processes files and saves extracted RDF to a named graph.

### [What named graph is created when ODS-Briefcase processes cloud storage files?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q8)

The default named graph is constructed from the host ODS instance, the ODS username, and the Briefcase folder name: `http://<host>[:<port>]/DAV/home/<user-name>/<folder-name>#this`. Expert users may customize this graph name.

### [What are ACL scopes in Virtuoso?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q9)

ACL scopes group rules by resource type. Common scopes include 'DAV Resources' for WebDAV-stored files and folders, 'Private Graphs' for named graphs in the quad store, and 'Query' for SPARQL query access. Scopes enable or disable ACL enforcement for specific resource categories.

### [How does HTTP content negotiation work with Virtuoso SPARQL endpoints?](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23q10)

Virtuoso SPARQL endpoints support HTTP content negotiation for result format selection. Clients can request specific MIME types via Accept headers. However, browser support beyond plain/text and text/html is limited, so the web UI provides a format dropdown for manual selection.

---

## Glossary

- **[SPARQL](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtSPARQL)** — SPARQL Protocol and RDF Query Language — the W3C standard query language for RDF data, supporting SELECT, DESCRIBE, CONSTRUCT, and ASK query forms. *See also: [DBpedia](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fdbpedia.org%2Fresource%2FSPARQL) · [Wikidata](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ59046)*
- **[DESCRIBE Query](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtDESCRIBE)** — A SPARQL query form that returns an RDF description of a resource, including all known triples about the resource and related entities.
- **[CONSTRUCT Query](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtCONSTRUCT)** — A SPARQL query form that builds a new RDF graph by instantiating a template with variable bindings from the query solution.
- **[SELECT Query](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtSELECT)** — A SPARQL query form that returns a table of variable bindings (a query solution set) matching the query pattern.
- **[WebID](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtWebID)** — A decentralized identification protocol using HTTP URIs and RDF profile documents for authentication, controlled by users rather than service providers. *See also: [DBpedia](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fdbpedia.org%2Fresource%2FWebID) · [Wikidata](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ3565868)*
- **[ACL (Access Control List)](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtACL)** — A list of permissions attached to a resource specifying which authenticated agents or agent classes can access the resource and what operations they can perform. *See also: [DBpedia](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fdbpedia.org%2Fresource%2FAccess_control_list) · [Wikidata](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ336890)*
- **[DET (Dynamic Extension Type)](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtDET)** — A Virtuoso feature that generates dynamic hypermedia resources from queries, exposed as files in WebDAV folders — analogous to materialized views.
- **[WebDAV](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtWebDAV)** — Web Distributed Authoring and Versioning — an extension of HTTP that allows clients to perform operations on remote web servers, enabling collaborative file management. *See also: [DBpedia](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fdbpedia.org%2Fresource%2FWebDAV) · [Wikidata](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ847362)*
- **[Virtuoso Sponger](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtSponger)** — RDF transformation middleware that extracts structured data from documents using Extractor and Meta Cartridges, converting various formats to RDF.
- **[ODS (OpenLink Data Spaces)](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtODS)** — A personal data space framework providing identity management, storage, and application hosting built on top of Virtuoso.
- **[HTTP Content Negotiation](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtContentNegotiation)** — An HTTP mechanism that allows a client to specify preferred media types, languages, or encodings, and the server to select the most appropriate representation. *See also: [DBpedia](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fdbpedia.org%2Fresource%2FContent_negotiation) · [Wikidata](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ1139745)*
- **[Named Graph](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23gtNamedGraph)** — An RDF graph identified by a URI, enabling grouping and access control of triples within a quad store (subject, predicate, object, graph). *See also: [DBpedia](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fdbpedia.org%2Fresource%2FNamed_graph) · [Wikidata](https://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ1067246)*

---

## How-To: Set Up Cloud Storage Access Control with ODS-Briefcase

### 1. [Get API Credentials from Your Cloud Provider](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23step1)

Register an application with your cloud storage provider (Google Drive, Dropbox, OneDrive, Box) through their developer console. Obtain the Client ID/API Key and Client Secret pair.

### 2. [Configure ODS Login Authentication Keys](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23step2)

Log into your Virtuoso+ODS instance as an administrator. Navigate to Site Settings > Login Authentication Keys. Select the appropriate API (Google API, Dropbox API, etc.), enter the credentials, and click Add.

### 3. [Create a New Briefcase Folder](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23step3)

In ODS-Briefcase, click New Folder. Specify a folder name and set the folder type to match your cloud service (Google Drive, Dropbox, OneDrive, Box, or S3).

### 4. [Configure Sponger Cartridges (Optional)](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23step4)

Enable the Virtuoso Sponger for your folder. Select which Extractor and Meta Cartridges to run against your files. Enable only applicable cartridges to minimize processing overhead.

### 5. [Authenticate with Your Cloud Provider](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23step5)

Click Authenticate. You will be prompted to enter your cloud provider credentials and authorize the ODS application to access your storage. The Google Drive API has a limit of 500,000 requests/day; Dropbox limits each app to 5 users by default.

### 6. [Set Up WebID-Based ACLs](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23step6)

Apply ACL rules to your Briefcase folder, sub-folders, or individual documents. Grant READ or WRITE access to specific WebIDs (e.g., LinkedIn profiles) or agent classes. ACLs can be applied via the ODS UI or the RESTful ACL API using Turtle.

### 7. [Test Access Through DET Mount Points](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23step7)

Access your cloud storage through the ODS-Briefcase WebDAV mount point. Visitors with valid WebIDs matching your ACL rules will be granted access. The mounted folder functions as a DET, generating content dynamically at request time.

---

## SPARQL Queries

### [Describe Article and Authors](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23describe-article)

[Run live query in URIBurner](https://linkeddata.uriburner.com/sparql?default-graph-uri=&query=PREFIX%20schema%3A%20%3Chttp%3A%2F%2Fschema.org%2F%3E%0A%0ADESCRIBE%20%3Chttps%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23analysis%3E%0A%20%20%20%20%20%20%20%3Chttps%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23kingsleyIdehen%3E%0A%20%20%20%20%20%20%20%3Chttps%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23tedThibodeau%3E&format=text%2Fx-html-nice-turtle&timeout=0&debug=on&run=+Run+Query+)

```sparql
PREFIX schema: <http://schema.org/>

DESCRIBE <https://medium.com/virtuoso-blog/dynamically-generating-documents-from-sparql-queries-7d6589505100#analysis>
         <https://medium.com/virtuoso-blog/dynamically-generating-documents-from-sparql-queries-7d6589505100#kingsleyIdehen>
         <https://medium.com/virtuoso-blog/dynamically-generating-documents-from-sparql-queries-7d6589505100#tedThibodeau>
```

### [List All FAQ Questions](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23list-faq)

[Run live query in URIBurner](https://linkeddata.uriburner.com/sparql?default-graph-uri=&query=PREFIX%20schema%3A%20%3Chttp%3A%2F%2Fschema.org%2F%3E%0A%0ASELECT%20%3Fq%20%3Fname%20%3Fanswer%0AWHERE%20%7B%0A%20%20GRAPH%20%3Chttps%3A%2F%2Flinkeddata.uriburner.com%2FDAV%2Fdemos%2Fdaas%2Fvirtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.ttl%3E%20%7B%0A%20%20%20%20%3Fq%20a%20schema%3AQuestion%20%3B%0A%20%20%20%20%20%20schema%3Aname%20%3Fname%20%3B%0A%20%20%20%20%20%20schema%3AacceptedAnswer%20%3Fa%20.%0A%20%20%20%20%3Fa%20schema%3Atext%20%3Fanswer%20.%0A%20%20%7D%0A%7D%0AORDER%20BY%20%3Fq&format=text%2Fx-html%2Btr&timeout=0&debug=on&run=+Run+Query+)

```sparql
PREFIX schema: <http://schema.org/>

SELECT ?q ?name ?answer
WHERE {
  GRAPH <https://linkeddata.uriburner.com/DAV/demos/daas/virtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.ttl> {
    ?q a schema:Question ;
      schema:name ?name ;
      schema:acceptedAnswer ?a .
    ?a schema:text ?answer .
  }
}
ORDER BY ?q
```

### [List Cloud Storage Services](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23list-cloud-services)

[Run live query in URIBurner](https://linkeddata.uriburner.com/sparql?default-graph-uri=&query=PREFIX%20schema%3A%20%3Chttp%3A%2F%2Fschema.org%2F%3E%0A%0ASELECT%20%3Fservice%20%3Fname%20%3Fstorage%20%3FapiLimit%0AWHERE%20%7B%0A%20%20GRAPH%20%3Chttps%3A%2F%2Flinkeddata.uriburner.com%2FDAV%2Fdemos%2Fdaas%2Fvirtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.ttl%3E%20%7B%0A%20%20%20%20%3Fservice%20a%20%3Chttps%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23CloudStorageService%3E%20%3B%0A%20%20%20%20%20%20schema%3Aname%20%3Fname%20.%0A%20%20%20%20OPTIONAL%20%7B%20%3Fservice%20%3Chttps%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23hasDefaultStorage%3E%20%3Fstorage%20%7D%0A%20%20%20%20OPTIONAL%20%7B%20%3Fservice%20%3Chttps%3A%2F%2Fmedium.com%2Fvirtuoso-blog%2Fdynamically-generating-documents-from-sparql-queries-7d6589505100%23hasAPILimit%3E%20%3FapiLimit%20%7D%0A%20%20%7D%0A%7D%0AORDER%20BY%20%3Fname&format=text%2Fx-html%2Btr&timeout=0&debug=on&run=+Run+Query+)

```sparql
PREFIX schema: <http://schema.org/>

SELECT ?service ?name ?storage ?apiLimit
WHERE {
  GRAPH <https://linkeddata.uriburner.com/DAV/demos/daas/virtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.ttl> {
    ?service a <https://medium.com/virtuoso-blog/dynamically-generating-documents-from-sparql-queries-7d6589505100#CloudStorageService> ;
      schema:name ?name .
    OPTIONAL { ?service <https://medium.com/virtuoso-blog/dynamically-generating-documents-from-sparql-queries-7d6589505100#hasDefaultStorage> ?storage }
    OPTIONAL { ?service <https://medium.com/virtuoso-blog/dynamically-generating-documents-from-sparql-queries-7d6589505100#hasAPILimit> ?apiLimit }
  }
}
ORDER BY ?name
```

---

## Attribution & Provenance

- **Source:** [Dynamically Generating Documents from SPARQL Queries](https://medium.com/virtuoso-blog/dynamically-generating-documents-from-sparql-queries-7d6589505100) & [Taking Control of Access to Resources Stored in Cloud Services](https://medium.com/virtuoso-blog/taking-control-of-access-to-resources-stored-in-google-drive-dropbox-microsoft-onedrive-box-and-d25ab3dd27d9)
- **Companion files:** [RDF Turtle](../rdf/virtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.ttl) | [JSON-LD](../rdf/virtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.jsonld) | [HTML](virtuoso-sparql-doc-gen-cloud-storage-acl-qwen3.6-plus-1.html)
- **Skills used:** [kg-generator](https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator) | [rdf-infographic-skill](https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/rdf-infographic-skill)
- **Generated by:** [qwen3.6-plus](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fhelp.aliyun.com%2Fzh%2Fmodel-studio%2Fmodels) via [opencode](https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fgithub.com%2Fanomalyco%2Fopencode)
- **Linked Data runtime:** [OpenLink Virtuoso](https://virtuoso.openlinksw.com/) / [URIBurner](https://linkeddata.uriburner.com/)
- **Resolver:** `https://linkeddata.uriburner.com/describe/?url={IRI}`
