@base <https://medium.com/virtuoso-blog/conceptual-data-virtualization-for-sql-and-rdf-using-open-standards-24520925c7ce> .
@prefix : <https://medium.com/virtuoso-blog/conceptual-data-virtualization-for-sql-and-rdf-using-open-standards-24520925c7ce#> .
@prefix post: <https://medium.com/virtuoso-blog/conceptual-data-virtualization-for-sql-and-rdf-using-open-standards-24520925c7ce#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix schema: <http://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix virtrdf: <http://www.openlinksw.com/schemas/virtrdf#> .
@prefix r2rml: <http://www.w3.org/ns/r2rml#> .
@prefix csv: <http://demo.openlinksw.com/schemas/csv_northwind/> .
@prefix ex: <https://example.com/> .
@prefix urn: <urn:> .
@prefix orthwind: <urn:demo.csv:northwind:> .

# ==============================================================================
# Document Entity & Self-Describing Metadata
# ==============================================================================

<> a schema:TechArticle , schema:CreativeWork ;
    schema:name "Conceptual Data Virtualization for SQL and RDF Using Open Standards"@en ;
    schema:headline "Conceptual Data Virtualization for SQL and RDF: Eliminating the Relational vs Graph Impedance Mismatch via Open Standards"@en ;
    schema:description "Comprehensive technical analysis and knowledge graph of Kingsley Uyi Idehen's publication on conceptual relational data virtualization, demonstrating how OpenLink Virtuoso unifies SQL relational tables and RDF knowledge graphs on the fly using W3C and ANSI open standards without physical data replication, contrasted with contemporary YAML-based semantic layers."@en ;
    schema:abstract """Conceptual data virtualization provides a declarative, open standards-based architecture that eliminates the historical impedance mismatch between relational databases and knowledge graphs. By leveraging ANSI SQL, W3C SPARQL, W3C R2RML, and HTTP URIs as global super keys within a high-performance multi-model RDBMS engine like OpenLink Virtuoso, enterprises can query, integrate, and reason across disparate relational schemas and semantic graphs in real time. Contrasted with contemporary YAML-based semantic layers (which remain confined to static metric modeling, local string identifiers, and SQL-only code generation without formal ontologies), open standards conceptual virtualization unlocks true graph traversal, dynamic OWL/RDFS deductive reasoning, and autonomous AI agent context readiness with zero data replication."""@en ;
    schema:datePublished "2018-09-04T12:00:00Z"^^xsd:dateTime ;
    schema:dateModified "2026-08-24T00:00:00Z"^^xsd:dateTime ;
    schema:inLanguage "en" ;
    schema:author <https://linkedin.com/in/kidehen#this> ;
    schema:accountablePerson <https://linkedin.com/in/kidehen#this> ;
    prov:wasGeneratedBy :agentKgGenerator , :agentRdfInfographicSkill , :agentDataTwingler , :agentGpt5Codex , :queryVerificationActivity ;
    schema:publisher <http://dbpedia.org/resource/OpenLink_Software> ;
    schema:mainEntity :article ;
    schema:about :article , :conceptDataVirtualization , <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:hasPart : , :faqSection , :glossarySection , :howtoSection , :comparisonMatrix ,
                   :queryClassesAndCounts ,
                   :queryNorthwindCustomers ,
                   :queryProductsSuppliersJoin ,
                   :queryOrdersDetailsJoin ,
                   :queryCustomersByCountry ,
                   :querySchemaOrgConstruct ,
                   :queryCategoriesProducts ,
                   :queryEmployeesOrders ,
                   :queryShippersOrders ,
                   :queryCustomerGrossSales ,
                   :queryMonthlySalesTrend ,
                   :queryProductRevenueRanking ,
                   :queryEmployeeRevenueContribution ,
                   :queryDestinationCountrySales ;
    dct:source <https://medium.com/virtuoso-blog/conceptual-data-virtualization-for-sql-and-rdf-using-open-standards-24520925c7ce> .

# ==============================================================================
# Author, Publisher & Provenance Agents
# ==============================================================================

<https://linkedin.com/in/kidehen#this> a schema:Person ;
    schema:name "Kingsley Uyi Idehen"@en ;
    schema:jobTitle "Founder & CEO"@en ;
    schema:worksFor <http://dbpedia.org/resource/OpenLink_Software> ;
    owl:sameAs <https://x.com/kidehen#this> ,
                  <https://kidehen.bio.link/#this> ,
                  <https://medium.com/@kidehen> ,
                  <http://dbpedia.org/resource/Kingsley_Idehen> .

:agentKgGenerator a schema:SoftwareApplication , prov:SoftwareAgent ;
    schema:name "kg-generator" ;
    schema:url "https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator"^^xsd:anyURI ;
    prov:actedOnBehalfOf <https://linkedin.com/in/kidehen#this> .

:agentRdfInfographicSkill a schema:SoftwareApplication , prov:SoftwareAgent ;
    schema:name "rdf-infographic-skill" ;
    schema:url "https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/rdf-infographic-skill"^^xsd:anyURI ;
    prov:actedOnBehalfOf <https://linkedin.com/in/kidehen#this> .

:agentDataTwingler a schema:SoftwareApplication , prov:SoftwareAgent ;
    schema:name "data-twingler" ;
    schema:url "https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/data-twingler"^^xsd:anyURI ;
    prov:actedOnBehalfOf <https://linkedin.com/in/kidehen#this> .

:agentGpt5Codex a schema:SoftwareApplication , prov:SoftwareAgent ;
    schema:name "GPT-5 Codex" ;
    schema:url "https://openai.com/codex/"^^xsd:anyURI ;
    prov:actedOnBehalfOf <https://linkedin.com/in/kidehen#this> .

<http://dbpedia.org/resource/OpenLink_Software> a schema:Organization ;
    schema:name "OpenLink Software"@en ;
    schema:url "https://www.openlinksw.com"^^xsd:anyURI ;
    schema:description "Developer of high-performance data integration, data access, and multi-model database software including OpenLink Virtuoso and Universal Data Access (UDA) middleware."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q7096180> .

<http://dbpedia.org/resource/OpenLink_Virtuoso> a schema:SoftwareApplication ;
    schema:name "OpenLink Virtuoso"@en ;
    schema:alternateName "Virtuoso Universal Server"@en , "Virtuoso RDBMS & Quad Store"@en ;
    schema:applicationCategory "Multi-Model RDBMS & Knowledge Graph Engine"@en ;
    schema:softwareVersion "8.3+" ;
    schema:author <http://dbpedia.org/resource/OpenLink_Software> ;
    schema:description "A high-performance multi-model RDBMS and RDF quad store supporting native SQL, SPARQL 1.1, SPASQL hybrid queries, R2RML declarative mapping, and virtual database (VDB) federation across heterogeneous external data sources."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q7935402> .

# ==============================================================================
# Lightweight Custom Ontology
# ==============================================================================

: a owl:Ontology ;
    schema:name "Conceptual Data Virtualization Ontology"@en ;
    schema:description "Lightweight formal ontology defining the architectural tiers, mapping mechanisms, and evaluation dimensions of conceptual data virtualization across SQL and RDF models, comparing W3C open standards with YAML-based semantic layers."@en ;
    schema:versionInfo "1.4" ;
    rdfs:isDefinedBy <https://medium.com/virtuoso-blog/conceptual-data-virtualization-for-sql-and-rdf-using-open-standards-24520925c7ce#> .

:ArchitecturalTier a owl:Class ;
    rdfs:label "Architectural Tier"@en ;
    rdfs:comment "A functional layer within the conceptual data virtualization architecture."@en ;
    rdfs:isDefinedBy : .

:IntegrationApproach a owl:Class ;
    rdfs:label "Integration Approach"@en ;
    rdfs:comment "A methodology for combining, modeling, or accessing multi-source relational and graph data."@en ;
    rdfs:isDefinedBy : .

:ComparisonDimension a owl:Class ;
    rdfs:subClassOf schema:DefinedTerm ;
    rdfs:label "Comparison Dimension"@en ;
    rdfs:comment "An evaluation criterion used to compare data integration, semantic layers, and virtualization architectures."@en ;
    rdfs:isDefinedBy : .

:VirtualizationMechanism a owl:Class ;
    rdfs:label "Virtualization Mechanism"@en ;
    rdfs:comment "A technical mechanism or declarative standard that enables conceptual mapping between data models."@en ;
    rdfs:isDefinedBy : .

# ==============================================================================
# Main Article & Core Concepts
# ==============================================================================

:article a schema:CreativeWork ;
    schema:name "Conceptual Data Virtualization for SQL and RDF Using Open Standards"@en ;
    schema:headline "Bridging the Relational-to-Graph Divide Without Physical Replication"@en ;
    schema:author <https://linkedin.com/in/kidehen#this> ;
    schema:publisher <http://dbpedia.org/resource/OpenLink_Software> ;
    schema:datePublished "2018-09-04"^^xsd:date ;
    schema:keywords "Data Virtualization", "Virtuoso", "SQL", "SPARQL", "RDF", "R2RML", "Linked Data", "Knowledge Graphs", "Open Standards", "SPASQL", "Semantic Layer", "YAML", "ODBC", "JDBC", "Northwind", "Named Graph" ;
    schema:about :conceptDataVirtualization , :conceptImpedanceMismatch , :conceptMultiModelRdbms , :conceptHttpSuperKeys .

:conceptDataVirtualization a schema:DefinedTerm ;
    schema:name "Conceptual Data Virtualization"@en ;
    schema:description "A declarative architecture where relational database schemas are mapped on the fly into virtual semantic RDF graphs using open standards like R2RML, allowing simultaneous query access via SQL and SPARQL without copying or moving underlying data."@en ;
    owl:sameAs <http://dbpedia.org/resource/Data_virtualization> .

:conceptImpedanceMismatch a schema:DefinedTerm ;
    schema:name "Relational-to-Graph Impedance Mismatch"@en ;
    schema:description "The structural and mathematical tension between tabular relational models (tuples in relations constrained by fixed schemas) and graph models (directed labeled property graphs and RDF subject-predicate-object triples with flexible, evolving ontologies)."@en ;
    owl:sameAs <http://dbpedia.org/resource/Object-relational_impedance_mismatch> .

:conceptMultiModelRdbms a schema:DefinedTerm ;
    schema:name "Multi-Model Relational Database Management System"@en ;
    schema:description "A unified database management system capable of natively storing, indexing, executing relational algebra (SQL), and querying semantic graph data (SPARQL) within a single execution core."@en ;
    owl:sameAs <http://dbpedia.org/resource/Multi-model_database> .

:conceptHttpSuperKeys a schema:DefinedTerm ;
    schema:name "HTTP URIs as Super Keys"@en ;
    schema:description "The use of resolvable HTTP Uniform Resource Identifiers to uniquely name and address entities globally across organizational and network boundaries, functioning as universal primary and foreign keys for Linked Data."@en ;
    owl:sameAs <http://dbpedia.org/resource/Uniform_Resource_Identifier> .

# ==============================================================================
# 4-Tier Architectural Hierarchy
# ==============================================================================

:tierPhysicalRelational a :ArchitecturalTier ;
    schema:name "Tier 1: Physical Relational & Storage Tier"@en ;
    schema:description "Native column-wise or row-wise SQL tables in Virtuoso, or heterogeneous remote relational databases (Oracle, Microsoft SQL Server, PostgreSQL, MySQL, IBM Db2) connected via ODBC/JDBC Virtual Database (VDB) federation."@en ;
    schema:position 1 .

:tierConceptualMapping a :ArchitecturalTier ;
    schema:name "Tier 2: Conceptual Mapping & Virtualization Layer"@en ;
    schema:description "Declarative W3C R2RML mapping documents and Virtuoso Quad Map definitions that translate tabular schemas, primary keys, and foreign keys into RDF classes, predicates, and graph URIs in real time."@en ;
    schema:position 2 .

:tierGraphSemantic a :ArchitecturalTier ;
    schema:name "Tier 3: Semantic Graph & Ontology Inference Tier"@en ;
    schema:description "Virtual RDF Quad Store presenting virtual graph views (e.g., <urn:demo.csv:northwind:data>), enabling W3C SPARQL 1.1 queries, OWL/RDFS reasoning (subClassOf, subPropertyOf, sameAs), and HTTP URI dereferencing."@en ;
    schema:position 3 .

:tierUniversalConsumption a :ArchitecturalTier ;
    schema:name "Tier 4: Universal Consumption & Agentic Interface Tier"@en ;
    schema:description "Universal declarative access for business intelligence (BI) dashboards, semantic faceted search (FCT), custom applications, LLMs, and autonomous AI agents through SQL, SPARQL, GraphQL, REST, and Linked Data."@en ;
    schema:position 4 .

# ==============================================================================
# Head-to-Head Comparison Matrix (Contemporary Comparison: 3 Approaches across 8 Dimensions)
# ==============================================================================

:comparisonMatrix a schema:Table ;
    schema:name "Contemporary Architecture Comparison: Open Standards Conceptual Virtualization vs YAML-Based Semantic Layers vs Dedicated Graph Stores"@en ;
    schema:description "Comprehensive comparison across eight critical evaluation dimensions demonstrating why open standards conceptual data virtualization (Virtuoso) fundamentally outperforms contemporary YAML-based semantic layers and dedicated graph store migrations."@en .

:approachYamlSemanticLayer a :IntegrationApproach ;
    schema:name "YAML-Based Semantic Layers (dbt / Cube / LookML)"@en ;
    schema:description "Configuration-driven metric layers defined in proprietary YAML files. Limited to generating SQL GROUP BY queries over data warehouses; no global entity identification, no graph traversal, and zero formal ontology reasoning."@en .

:approachDedicatedGraphStore a :IntegrationApproach ;
    schema:name "Dedicated Physical Graph Stores"@en ;
    schema:description "Full data replication into standalone graph databases. Breaks existing SQL/BI tooling, requires custom ETL synchronization, and isolates graph data from relational transactions."@en .

:approachConceptualVirtualization a :IntegrationApproach ;
    schema:name "Open Standards Conceptual Virtualization (Virtuoso)"@en ;
    schema:description "Real-time, zero-replication declarative mapping of relational assets into virtual RDF knowledge graphs via W3C R2RML, ANSI SQL, and W3C SPARQL with complete dual-model access, global HTTP URIs, and dynamic OWL/RDFS inferencing."@en .

# 8 Comparison Dimensions (First-class instances)

:dimSpecificationModel a :ComparisonDimension ;
    schema:name "Specification Model & Standard Portability"@en ;
    schema:description "Whether semantics are defined in proprietary configuration files (YAML) or open W3C standards (R2RML, RDF, OWL)."@en ;
    schema:position 1 .

:dimEntityIdentity a :ComparisonDimension ;
    schema:name "Entity Identity & Global Resolution"@en ;
    schema:description "Use of local string column labels vs globally unique, dereferenceable HTTP URI super keys."@en ;
    schema:position 2 .

:dimSemanticReasoning a :ComparisonDimension ;
    schema:name "Formal Ontology & Deductive Reasoning"@en ;
    schema:description "Support for formal ontology axioms, class taxonomies (subClassOf), property hierarchies, and automated inference."@en ;
    schema:position 3 .

:dimQueryAlgebra a :ComparisonDimension ;
    schema:name "Query Algebra & Dual-Model Execution"@en ;
    schema:description "Ability to execute graph pattern matching (SPARQL), recursive path traversal, and relational algebra (SQL) over the same data."@en ;
    schema:position 4 .

:dimDataMovement a :ComparisonDimension ;
    schema:name "Data Movement & Storage Overhead"@en ;
    schema:description "Whether data must be copied into separate repositories or virtualized in-place with zero replication."@en ;
    schema:position 5 .

:dimAiAgentReadiness a :ComparisonDimension ;
    schema:name "AI Agent & LLM Context Interoperability"@en ;
    schema:description "Readiness to provide self-describing, machine-readable knowledge graphs for agentic reasoning and entity disambiguation."@en ;
    schema:position 6 .

:dimEcosystemIntegration a :ComparisonDimension ;
    schema:name "Tool & BI Ecosystem Compatibility"@en ;
    schema:description "Preservation of industry-standard ODBC, JDBC, ADO.NET, and relational BI dashboard connectivity."@en ;
    schema:position 7 .

:dimSchemaAgility a :ComparisonDimension ;
    schema:name "Schema Evolution & Cross-Silo Federation"@en ;
    schema:description "Ability to federate heterogeneous external RDBMS sources and evolve schemas without breaking downstream models."@en ;
    schema:position 8 .

# ==============================================================================
# Technical Glossary (10 Core Terms with Primary DBpedia IRIs)
# ==============================================================================

:glossarySection a skos:ConceptScheme , schema:DefinedTermSet ;
    schema:name "Core Technical Glossary of Conceptual Data Virtualization"@en ;
    schema:description "Definitions of foundational concepts, standards, query languages, and architectural components in conceptual data virtualization."@en ;
    schema:hasDefinedTerm <http://dbpedia.org/resource/Data_virtualization> , <http://dbpedia.org/resource/SQL> , <http://dbpedia.org/resource/SPARQL> , <http://dbpedia.org/resource/Resource_Description_Framework> ,
                           <http://dbpedia.org/resource/Relational_database> , <http://dbpedia.org/resource/Linked_data> , <http://dbpedia.org/resource/Knowledge_graph> ,
                           <http://dbpedia.org/resource/Open_Database_Connectivity> , <http://dbpedia.org/resource/Uniform_Resource_Identifier> , <http://dbpedia.org/resource/Ontology_(information_science)> .

<http://dbpedia.org/resource/Data_virtualization> a skos:Concept , schema:DefinedTerm ;
    schema:name "Data Virtualization"@en ;
    skos:prefLabel "Data Virtualization"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "An approach to data management that allows an application to retrieve and manipulate data without requiring technical details about how it is formatted or where it is physically located."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q5227289> .

<http://dbpedia.org/resource/SQL> a skos:Concept , schema:DefinedTerm ;
    schema:name "SQL (Structured Query Language)"@en ;
    skos:prefLabel "SQL"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "A domain-specific language used in programming and designed for managing data held in a relational database management system (RDBMS), standardized by ANSI and ISO."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q47607> .

<http://dbpedia.org/resource/SPARQL> a skos:Concept , schema:DefinedTerm ;
    schema:name "SPARQL (SPARQL Protocol and RDF Query Language)"@en ;
    skos:prefLabel "SPARQL"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "An RDF query language and W3C standard for querying and manipulating directed labeled graph data stored in RDF format across disparate endpoints."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q54871> .

<http://dbpedia.org/resource/Resource_Description_Framework> a skos:Concept , schema:DefinedTerm ;
    schema:name "RDF (Resource Description Framework)"@en ;
    skos:prefLabel "RDF"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "A W3C standard family for data interchange on the Web, representing information as subject-predicate-object triples that form directed labeled knowledge graphs."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q54872> .

<http://dbpedia.org/resource/Relational_database> a skos:Concept , schema:DefinedTerm ;
    schema:name "Relational Database (RDBMS)"@en ;
    skos:prefLabel "Relational Database"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "A digital database based on the relational model of data, organizing information into tables (relations) of rows (tuples) and columns (attributes) linked by primary and foreign keys."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q192588> .

<http://dbpedia.org/resource/Linked_data> a skos:Concept , schema:DefinedTerm ;
    schema:name "Linked Data"@en ;
    skos:prefLabel "Linked Data"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "A set of design principles for publishing structured data on the Web using HTTP URIs as names, standard formats (RDF), and hyperlinks to interconnect disparate data silos."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q515701> .

<http://dbpedia.org/resource/Knowledge_graph> a skos:Concept , schema:DefinedTerm ;
    schema:name "Knowledge Graph"@en ;
    skos:prefLabel "Knowledge Graph"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "A structured representation of real-world entities, concepts, and their interrelationships modeled as nodes and edges with formal semantic descriptions and ontologies."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q33002955> .

<http://dbpedia.org/resource/Open_Database_Connectivity> a skos:Concept , schema:DefinedTerm ;
    schema:name "ODBC / JDBC Connectivity"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "Standard application programming interfaces (APIs) for accessing database management systems across diverse operating systems and programming languages."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q839566> .

<http://dbpedia.org/resource/Uniform_Resource_Identifier> a skos:Concept , schema:DefinedTerm ;
    schema:name "HTTP URI (Uniform Resource Identifier)"@en ;
    skos:prefLabel "HTTP URI"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "A unique string of characters identifying a network resource or abstract concept, used in Linked Data as global identifiers and dereferenceable super keys."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q61694> .

<http://dbpedia.org/resource/Ontology_(information_science)> a skos:Concept , schema:DefinedTerm ;
    schema:name "Ontology (Information Science)"@en ;
    skos:prefLabel "Ontology"@en ;
    schema:inDefinedTermSet :glossarySection ;
    schema:description "A formal, explicit specification of a shared conceptualization, defining classes, properties, axioms, and constraints that enable automated deductive reasoning over instance data."@en ;
    owl:sameAs <http://www.wikidata.org/entity/Q324254> .

# ==============================================================================
# HowTo Pipeline: 7-Step Implementation Workflow
# ==============================================================================

:howtoSection a schema:HowTo ;
    schema:name "How to Implement Conceptual Relational Data Virtualization using Open Standards"@en ;
    schema:description "A 7-step engineering roadmap for implementing real-time conceptual data virtualization across relational databases and RDF knowledge graphs using OpenLink Virtuoso."@en ;
    schema:step post:step1 , post:step2 , post:step3 , post:step4 , post:step5 , post:step6 , post:step7 .

post:step1 a schema:HowToStep ;
    schema:name "1. Inventory & Connect Relational Data Sources"@en ;
    schema:position 1 ;
    schema:text "Identify target relational databases (e.g., Oracle, SQL Server, PostgreSQL, MySQL) and link them into Virtuoso's Virtual Database (VDB) engine using standard ODBC/JDBC drivers."@en .

post:step2 a schema:HowToStep ;
    schema:name "2. Establish Global Entity Identifiers with HTTP URIs"@en ;
    schema:position 2 ;
    schema:text "Define URI minting schemes for entities (e.g., customers, products, orders) using HTTP URIs that act as universal 'super keys' across disparate table schemas and silos."@en .

post:step3 a schema:HowToStep ;
    schema:name "3. Author Declarative R2RML & Quad Map Definitions"@en ;
    schema:position 3 ;
    schema:text "Generate declarative W3C R2RML mappings or Virtuoso Quad Map declarations that bind relational tables and foreign keys to target ontology classes and predicates."@en .

post:step4 a schema:HowToStep ;
    schema:name "4. Instantiate the Virtual RDF Graph Views"@en ;
    schema:position 4 ;
    schema:text "Execute the mapping definitions inside Virtuoso to instantiate named graph views (e.g., <urn:demo.csv:northwind:data>), creating a real-time virtual knowledge graph without physical data duplication."@en .

post:step5 a schema:HowToStep ;
    schema:name "5. Execute Dual-Model Queries (SQL, SPARQL & SPASQL)"@en ;
    schema:position 5 ;
    schema:text "Query the virtualized data using native SQL for tabular analytics, SPARQL for semantic relationship discovery, or SPASQL to execute hybrid graph-relational queries in a single statement."@en .

post:step6 a schema:HowToStep ;
    schema:name "6. Apply Ontology Reasoning & Inferences"@en ;
    schema:position 6 ;
    schema:text "Bind W3C OWL and RDFS rule sets to the virtual graphs, enabling Virtuoso's built-in inference engine to resolve subClassOf, subPropertyOf, and sameAs relationships dynamically."@en .

post:step7 a schema:HowToStep ;
    schema:name "7. Publish to BI Dashboards, Applications & AI Agents"@en ;
    schema:position 7 ;
    schema:text "Expose the virtualized knowledge graph to external BI tools via ODBC/JDBC, web applications via REST/GraphQL, and LLMs/AI agents through structured SPARQL endpoints."@en .

# ==============================================================================
# Frequently Asked Questions (Exactly 12 schema:Question Items)
# ==============================================================================

:faqSection a schema:FAQPage ;
    schema:name "Frequently Asked Questions About Conceptual Data Virtualization & Semantic Layers"@en ;
    schema:description "Comprehensive answers to the 12 most critical architectural, operational, and strategic questions comparing conceptual data virtualization with YAML-based semantic layers."@en ;
    schema:mainEntity :q1 , :q2 , :q3 , :q4 , :q5 , :q6 , :q7 , :q8 , :q9 , :q10 , :q11 , :q12 .

:q1 a schema:Question ;
    schema:name "What is conceptual data virtualization in the context of SQL and RDF?"@en ;
    schema:position 1 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "Conceptual data virtualization is an architectural approach that maps structured relational database tables into virtual RDF knowledge graphs in real time. Instead of physically copying data via batch ETL, a multi-model engine like Virtuoso executes query rewrites on the fly, allowing developers to query relational data as a knowledge graph using SPARQL, or query graph data as tables using SQL."@en
    ] .

:q2 a schema:Question ;
    schema:name "How does conceptual virtualization differ from contemporary YAML-based semantic layers (e.g., dbt, Cube, LookML)?"@en ;
    schema:position 2 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "YAML-based semantic layers are configuration-driven templates designed primarily to generate SQL GROUP BY queries for BI metrics. They rely on local string identifiers, lack formal ontology models, cannot perform graph traversals or recursive queries, and offer no automated deductive reasoning. In contrast, conceptual virtualization uses W3C standards (RDF, OWL, SPARQL, R2RML) with global HTTP URI super keys, dynamic ontology inference, and simultaneous dual SQL/SPARQL query execution."@en
    ] .

:q3 a schema:Question ;
    schema:name "Why are YAML-based semantic layers insufficient for autonomous AI Agents and LLMs?"@en ;
    schema:position 3 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "YAML semantic layers only describe metric definitions and table joins in static text files, requiring LLMs to generate brittle SQL queries that are prone to hallucinated joins. Conceptual virtualization provides a live, self-describing Knowledge Graph where entities and relationships are globally identified by HTTP URIs, allowing AI agents to explore context, disambiguate terms, and follow property paths dynamically via SPARQL."@en
    ] .

:q4 a schema:Question ;
    schema:name "What is a 'super key' in the context of Linked Data and HTTP URIs?"@en ;
    schema:position 4 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "In relational databases and YAML semantic layers, keys and dimension names are scoped locally within a single table, project, or warehouse. In Linked Data, HTTP URIs serve as 'super keys'—globally unique, network-resolvable identifiers that uniquely name an entity across disparate databases, enterprise departments, and the global Web."@en
    ] .

:q5 a schema:Question ;
    schema:name "How does W3C R2RML compare to proprietary YAML mapping files?"@en ;
    schema:position 5 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "R2RML is a vendor-neutral W3C standard expressed in RDF itself, ensuring complete portability across any compliant graph engine. YAML mapping files are proprietary to individual tools (e.g., dbt MetricFlow YAML, Cube YAML) and lock organizations into a specific vendor's compilation engine without semantic interoperability."@en
    ] .

:q6 a schema:Question ;
    schema:name "Does conceptual data virtualization require moving or copying data?"@en ;
    schema:position 6 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "No. Conceptual data virtualization is zero-replication. Relational data remains in its native tables (in Virtuoso or external remote databases). Virtuoso executes dynamic query transformation at query time, guaranteeing that graph queries always access the freshest, live transactional state."@en
    ] .

:q7 a schema:Question ;
    schema:name "What is SPASQL and how does it enable hybrid queries?"@en ;
    schema:position 7 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "SPASQL (SPARQL embedded in SQL) is Virtuoso's extension that allows SPARQL queries to be executed directly inside SQL statements (e.g., `SPARQL SELECT ...` or SQL `FROM (SPARQL SELECT ...)`). This enables existing SQL tools, reporting software, and BI dashboards to leverage semantic graph traversal and inference without requiring a dedicated SPARQL client."@en
    ] .

:q8 a schema:Question ;
    schema:name "Can external third-party relational databases be virtualized as RDF graphs?"@en ;
    schema:position 8 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "Yes. Virtuoso's Virtual Database (VDB) layer can link remote databases such as Oracle, Microsoft SQL Server, PostgreSQL, MySQL, DB2, and Informix via ODBC/JDBC. Once linked, these remote tables can be mapped to virtual RDF graphs using R2RML, creating a unified semantic layer across the entire enterprise."@en
    ] .

:q9 a schema:Question ;
    schema:name "How does automated ontology reasoning work over virtualized data?"@en ;
    schema:position 9 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "Virtuoso includes a built-in backward-chaining inference engine. When an ontology (e.g., specifying that `ex:hasManager` is a sub-property of `ex:reportsTo`) is bound to a virtual graph, SPARQL queries automatically infer implicit relationships across relational data rows on the fly without materializing additional triples."@en
    ] .

:q10 a schema:Question ;
    schema:name "How does conceptual virtualization eliminate the relational vs graph impedance mismatch?"@en ;
    schema:position 10 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "The impedance mismatch occurs because relational databases enforce fixed tabular schemas and tuple calculus, while graphs model flexible, interconnected entities with evolving relationships. Virtuoso eliminates this tension by treating tables and graphs as dual mathematical projections of the same underlying data, allowing users to choose the optimal query language (SQL or SPARQL) without altering storage."@en
    ] .

:q11 a schema:Question ;
    schema:name "What are the performance characteristics of Virtuoso's query rewrite engine?"@en ;
    schema:position 11 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "Virtuoso's cost-based SQL/SPARQL optimizer translates SPARQL graph patterns into optimized SQL joins over indexed relational primary/foreign keys. Benchmarks demonstrate that Virtuoso's virtualized SPARQL execution often approaches native SQL performance by pushing joins and filters directly into the storage engine."@en
    ] .

:q12 a schema:Question ;
    schema:name "How does this architecture compare to traditional ETL data warehousing?"@en ;
    schema:position 12 ;
    schema:acceptedAnswer [
        a schema:Answer ;
        schema:text "Traditional ETL pipelines suffer from data latency, high storage duplication costs, fragile schema maintenance, and rigid downstream models. Conceptual virtualization eliminates ETL pipelines, delivers real-time live data queries, enables schema agility via ontology mappings, and reduces total cost of ownership."@en
    ] .

# ==============================================================================
# Live SPARQL Query Showcases over <urn:demo.csv:northwind:data>
# Every recipe projects or constructs at least one HTTP entity IRI.
# ==============================================================================

:queryClassesAndCounts a schema:SoftwareSourceCode ;
    schema:name "1. Entity Classes & Instance Counts"@en ;
    schema:description "Inventory every virtualized class, with a dereferenceable sample entity IRI for each class."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Diagnostic schema discovery"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?sampleEntity" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """SELECT DISTINCT ?class (SAMPLE(?entity) AS ?sampleEntity) (COUNT(*) AS ?count)
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?entity a ?class .
}
GROUP BY ?class
ORDER BY DESC(?count)
LIMIT 50""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=SELECT+DISTINCT+%3Fclass+%28SAMPLE%28%3Fentity%29+AS+%3FsampleEntity%29+%28COUNT%28%2A%29+AS+%3Fcount%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3Fentity+a+%3Fclass+.%0A%7D%0AGROUP+BY+%3Fclass%0AORDER+BY+DESC%28%3Fcount%29%0ALIMIT+50&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryNorthwindCustomers a schema:SoftwareSourceCode ;
    schema:name "2. Virtualized Customers Exploration"@en ;
    schema:description "Inspect customer attributes while retaining the customer HTTP IRI as the stable row identity."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Entity exploration"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?customer" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>

SELECT DISTINCT
       (SAMPLE(?customerValue) AS ?customer)
       (SAMPLE(?companyNameValue) AS ?companyName)
       (SAMPLE(?contactNameValue) AS ?contactName)
       (SAMPLE(?cityValue) AS ?city)
       (SAMPLE(?countryValue) AS ?country)
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?customerValue a csv:customers ;
                 csv:customerid ?customerId ;
                 csv:companyname ?companyNameValue ;
                 csv:contactname ?contactNameValue ;
                 csv:city ?cityValue ;
                 csv:country ?countryValue .
}
GROUP BY ?customerId
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0A%0ASELECT+DISTINCT%0A+++++++%28SAMPLE%28%3FcustomerValue%29+AS+%3Fcustomer%29%0A+++++++%28SAMPLE%28%3FcompanyNameValue%29+AS+%3FcompanyName%29%0A+++++++%28SAMPLE%28%3FcontactNameValue%29+AS+%3FcontactName%29%0A+++++++%28SAMPLE%28%3FcityValue%29+AS+%3Fcity%29%0A+++++++%28SAMPLE%28%3FcountryValue%29+AS+%3Fcountry%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3FcustomerValue+a+csv%3Acustomers+%3B%0A+++++++++++++++++csv%3Acustomerid+%3FcustomerId+%3B%0A+++++++++++++++++csv%3Acompanyname+%3FcompanyNameValue+%3B%0A+++++++++++++++++csv%3Acontactname+%3FcontactNameValue+%3B%0A+++++++++++++++++csv%3Acity+%3FcityValue+%3B%0A+++++++++++++++++csv%3Acountry+%3FcountryValue+.%0A%7D%0AGROUP+BY+%3FcustomerId%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryProductsSuppliersJoin a schema:SoftwareSourceCode ;
    schema:name "3. Products & Suppliers Virtual Graph Traversal"@en ;
    schema:description "Traverse product-to-supplier relationships and expose both participating entity IRIs."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Two-table traversal"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?product, ?supplier" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>

SELECT DISTINCT
       (SAMPLE(?productValue) AS ?product)
       (SAMPLE(?supplierValue) AS ?supplier)
       (SAMPLE(?productNameValue) AS ?productName)
       (SAMPLE(?unitPriceValue) AS ?unitPrice)
       (SAMPLE(?supplierNameValue) AS ?supplierName)
       (SAMPLE(?supplierCountryValue) AS ?supplierCountry)
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?productValue a csv:products ;
                csv:productid ?productId ;
                csv:productname ?productNameValue ;
                csv:unitprice ?unitPriceValue ;
                csv:supplierid ?supplierId .
  ?supplierValue a csv:suppliers ;
                 csv:supplierid ?supplierId ;
                 csv:companyname ?supplierNameValue ;
                 csv:country ?supplierCountryValue .
}
GROUP BY ?productId
ORDER BY DESC(SAMPLE(?unitPriceValue))
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0A%0ASELECT+DISTINCT%0A+++++++%28SAMPLE%28%3FproductValue%29+AS+%3Fproduct%29%0A+++++++%28SAMPLE%28%3FsupplierValue%29+AS+%3Fsupplier%29%0A+++++++%28SAMPLE%28%3FproductNameValue%29+AS+%3FproductName%29%0A+++++++%28SAMPLE%28%3FunitPriceValue%29+AS+%3FunitPrice%29%0A+++++++%28SAMPLE%28%3FsupplierNameValue%29+AS+%3FsupplierName%29%0A+++++++%28SAMPLE%28%3FsupplierCountryValue%29+AS+%3FsupplierCountry%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3FproductValue+a+csv%3Aproducts+%3B%0A++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A++++++++++++++++csv%3Aproductname+%3FproductNameValue+%3B%0A++++++++++++++++csv%3Aunitprice+%3FunitPriceValue+%3B%0A++++++++++++++++csv%3Asupplierid+%3FsupplierId+.%0A++%3FsupplierValue+a+csv%3Asuppliers+%3B%0A+++++++++++++++++csv%3Asupplierid+%3FsupplierId+%3B%0A+++++++++++++++++csv%3Acompanyname+%3FsupplierNameValue+%3B%0A+++++++++++++++++csv%3Acountry+%3FsupplierCountryValue+.%0A%7D%0AGROUP+BY+%3FproductId%0AORDER+BY+DESC%28SAMPLE%28%3FunitPriceValue%29%29%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryOrdersDetailsJoin a schema:SoftwareSourceCode ;
    schema:name "4. Orders, Customers & Order Details"@en ;
    schema:description "Return one row per order, with representative customer and line-item values selected by SAMPLE() while retaining global entity identity."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Four-table traversal"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?order, ?customer, ?product" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>

SELECT DISTINCT
       (SAMPLE(?orderValue) AS ?order)
       (SAMPLE(?customerValue) AS ?customer)
       (SAMPLE(?productValue) AS ?product)
       (SAMPLE(?companyNameValue) AS ?companyName)
       (SAMPLE(?orderDateValue) AS ?orderDate)
       (SAMPLE(?productNameValue) AS ?productName)
       (SAMPLE(?quantityValue) AS ?quantity)
       (SAMPLE(?unitPriceValue) AS ?unitPrice)
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?orderValue a csv:orders ;
              csv:orderid ?orderId ;
              csv:customerid ?customerId ;
              csv:orderdate ?orderDateValue .
  ?customerValue a csv:customers ;
                 csv:customerid ?customerId ;
                 csv:companyname ?companyNameValue .
  ?detail a csv:orders_details ;
          csv:orderid ?orderId ;
          csv:productid ?productId ;
          csv:quantity ?quantityValue ;
          csv:unitprice ?unitPriceValue .
  ?productValue a csv:products ;
                csv:productid ?productId ;
                csv:productname ?productNameValue .
}
GROUP BY ?orderId
ORDER BY DESC(SAMPLE(?orderDateValue))
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0A%0ASELECT+DISTINCT%0A+++++++%28SAMPLE%28%3ForderValue%29+AS+%3Forder%29%0A+++++++%28SAMPLE%28%3FcustomerValue%29+AS+%3Fcustomer%29%0A+++++++%28SAMPLE%28%3FproductValue%29+AS+%3Fproduct%29%0A+++++++%28SAMPLE%28%3FcompanyNameValue%29+AS+%3FcompanyName%29%0A+++++++%28SAMPLE%28%3ForderDateValue%29+AS+%3ForderDate%29%0A+++++++%28SAMPLE%28%3FproductNameValue%29+AS+%3FproductName%29%0A+++++++%28SAMPLE%28%3FquantityValue%29+AS+%3Fquantity%29%0A+++++++%28SAMPLE%28%3FunitPriceValue%29+AS+%3FunitPrice%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3ForderValue+a+csv%3Aorders+%3B%0A++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A++++++++++++++csv%3Acustomerid+%3FcustomerId+%3B%0A++++++++++++++csv%3Aorderdate+%3ForderDateValue+.%0A++%3FcustomerValue+a+csv%3Acustomers+%3B%0A+++++++++++++++++csv%3Acustomerid+%3FcustomerId+%3B%0A+++++++++++++++++csv%3Acompanyname+%3FcompanyNameValue+.%0A++%3Fdetail+a+csv%3Aorders_details+%3B%0A++++++++++csv%3Aorderid+%3ForderId+%3B%0A++++++++++csv%3Aproductid+%3FproductId+%3B%0A++++++++++csv%3Aquantity+%3FquantityValue+%3B%0A++++++++++csv%3Aunitprice+%3FunitPriceValue+.%0A++%3FproductValue+a+csv%3Aproducts+%3B%0A++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A++++++++++++++++csv%3Aproductname+%3FproductNameValue+.%0A%7D%0AGROUP+BY+%3ForderId%0AORDER+BY+DESC%28SAMPLE%28%3ForderDateValue%29%29%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryCustomersByCountry a schema:SoftwareSourceCode ;
    schema:name "5. Customers by Country"@en ;
    schema:description "Aggregate by country while retaining one sample customer IRI as a navigable entry point into each group."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Real-time aggregation"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?sampleCustomer" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>

SELECT DISTINCT ?country (SAMPLE(?customer) AS ?sampleCustomer) (COUNT(DISTINCT ?customer) AS ?customerCount)
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?customer a csv:customers ;
            csv:country ?country .
}
GROUP BY ?country
ORDER BY DESC(?customerCount)
LIMIT 15""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0A%0ASELECT+DISTINCT+%3Fcountry+%28SAMPLE%28%3Fcustomer%29+AS+%3FsampleCustomer%29+%28COUNT%28DISTINCT+%3Fcustomer%29+AS+%3FcustomerCount%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3Fcustomer+a+csv%3Acustomers+%3B%0A++++++++++++csv%3Acountry+%3Fcountry+.%0A%7D%0AGROUP+BY+%3Fcountry%0AORDER+BY+DESC%28%3FcustomerCount%29%0ALIMIT+15&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:querySchemaOrgConstruct a schema:SoftwareSourceCode ;
    schema:name "6. Schema.org Linked Data Transformation"@en ;
    schema:description "Re-express source rows as Schema.org organizations while preserving each customer HTTP IRI."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "CONSTRUCT transformation"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?customer" ;
    schema:comment "RDF graph set semantics suppress duplicate constructed triples."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>
PREFIX schema: <http://schema.org/>

CONSTRUCT {
  ?customer a schema:Organization ;
            schema:name ?companyName ;
            schema:address [
              a schema:PostalAddress ;
              schema:addressLocality ?city ;
              schema:addressCountry ?country
            ] .
}
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?customer a csv:customers ;
            csv:companyname ?companyName ;
            csv:city ?city ;
            csv:country ?country .
}
LIMIT 10""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0APREFIX+schema%3A+%3Chttp%3A%2F%2Fschema.org%2F%3E%0A%0ACONSTRUCT+%7B%0A++%3Fcustomer+a+schema%3AOrganization+%3B%0A++++++++++++schema%3Aname+%3FcompanyName+%3B%0A++++++++++++schema%3Aaddress+%5B%0A++++++++++++++a+schema%3APostalAddress+%3B%0A++++++++++++++schema%3AaddressLocality+%3Fcity+%3B%0A++++++++++++++schema%3AaddressCountry+%3Fcountry%0A++++++++++++%5D+.%0A%7D%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3Fcustomer+a+csv%3Acustomers+%3B%0A++++++++++++csv%3Acompanyname+%3FcompanyName+%3B%0A++++++++++++csv%3Acity+%3Fcity+%3B%0A++++++++++++csv%3Acountry+%3Fcountry+.%0A%7D%0ALIMIT+10&format=text%2Fx-html-nice-turtle&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryCategoriesProducts a schema:SoftwareSourceCode ;
    schema:name "7. Categories to Products: Portfolio Navigation"@en ;
    schema:description "Move from a category IRI to its product IRIs and compare prices without a materialized graph copy."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Category traversal"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?category, ?product" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>

SELECT DISTINCT
       (SAMPLE(?productValue) AS ?product)
       (SAMPLE(?categoryValue) AS ?category)
       (SAMPLE(?categoryNameValue) AS ?categoryName)
       (SAMPLE(?productNameValue) AS ?productName)
       (SAMPLE(?unitPriceValue) AS ?unitPrice)
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?categoryValue a csv:categories ;
                 csv:categoryid ?categoryId ;
                 csv:categoryname ?categoryNameValue .
  ?productValue a csv:products ;
                csv:productid ?productId ;
                csv:categoryid ?categoryId ;
                csv:productname ?productNameValue ;
                csv:unitprice ?unitPriceValue .
}
GROUP BY ?productId
ORDER BY ?categoryName DESC(?unitPrice)
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0A%0ASELECT+DISTINCT%0A+++++++%28SAMPLE%28%3FproductValue%29+AS+%3Fproduct%29%0A+++++++%28SAMPLE%28%3FcategoryValue%29+AS+%3Fcategory%29%0A+++++++%28SAMPLE%28%3FcategoryNameValue%29+AS+%3FcategoryName%29%0A+++++++%28SAMPLE%28%3FproductNameValue%29+AS+%3FproductName%29%0A+++++++%28SAMPLE%28%3FunitPriceValue%29+AS+%3FunitPrice%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3FcategoryValue+a+csv%3Acategories+%3B%0A+++++++++++++++++csv%3Acategoryid+%3FcategoryId+%3B%0A+++++++++++++++++csv%3Acategoryname+%3FcategoryNameValue+.%0A++%3FproductValue+a+csv%3Aproducts+%3B%0A++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A++++++++++++++++csv%3Acategoryid+%3FcategoryId+%3B%0A++++++++++++++++csv%3Aproductname+%3FproductNameValue+%3B%0A++++++++++++++++csv%3Aunitprice+%3FunitPriceValue+.%0A%7D%0AGROUP+BY+%3FproductId%0AORDER+BY+%3FcategoryName+DESC%28%3FunitPrice%29%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryEmployeesOrders a schema:SoftwareSourceCode ;
    schema:name "8. Employees to Orders: Operational Responsibility"@en ;
    schema:description "Use employee and order IRIs to connect responsible people with recent fulfillment activity."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Responsibility traversal"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?employee, ?order" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>

SELECT DISTINCT
       (SAMPLE(?orderValue) AS ?order)
       (SAMPLE(?employeeValue) AS ?employee)
       (SAMPLE(?firstNameValue) AS ?firstName)
       (SAMPLE(?lastNameValue) AS ?lastName)
       (SAMPLE(?orderDateValue) AS ?orderDate)
       (SAMPLE(?shipCountryValue) AS ?shipCountry)
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?employeeValue a csv:employees ;
                 csv:employeeid ?employeeId ;
                 csv:firstname ?firstNameValue ;
                 csv:lastname ?lastNameValue .
  ?orderValue a csv:orders ;
              csv:orderid ?orderId ;
              csv:employeeid ?employeeId ;
              csv:orderdate ?orderDateValue ;
              csv:shipcountry ?shipCountryValue .
}
GROUP BY ?orderId
ORDER BY DESC(SAMPLE(?orderDateValue))
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0A%0ASELECT+DISTINCT%0A+++++++%28SAMPLE%28%3ForderValue%29+AS+%3Forder%29%0A+++++++%28SAMPLE%28%3FemployeeValue%29+AS+%3Femployee%29%0A+++++++%28SAMPLE%28%3FfirstNameValue%29+AS+%3FfirstName%29%0A+++++++%28SAMPLE%28%3FlastNameValue%29+AS+%3FlastName%29%0A+++++++%28SAMPLE%28%3ForderDateValue%29+AS+%3ForderDate%29%0A+++++++%28SAMPLE%28%3FshipCountryValue%29+AS+%3FshipCountry%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3FemployeeValue+a+csv%3Aemployees+%3B%0A+++++++++++++++++csv%3Aemployeeid+%3FemployeeId+%3B%0A+++++++++++++++++csv%3Afirstname+%3FfirstNameValue+%3B%0A+++++++++++++++++csv%3Alastname+%3FlastNameValue+.%0A++%3ForderValue+a+csv%3Aorders+%3B%0A++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A++++++++++++++csv%3Aemployeeid+%3FemployeeId+%3B%0A++++++++++++++csv%3Aorderdate+%3ForderDateValue+%3B%0A++++++++++++++csv%3Ashipcountry+%3FshipCountryValue+.%0A%7D%0AGROUP+BY+%3ForderId%0AORDER+BY+DESC%28SAMPLE%28%3ForderDateValue%29%29%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryShippersOrders a schema:SoftwareSourceCode ;
    schema:name "9. Shippers to Orders: Delivery Network"@en ;
    schema:description "Navigate from shipper IRIs to order IRIs and inspect the destinations served by each carrier."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Logistics traversal"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?shipper, ?order" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>

SELECT DISTINCT
       (SAMPLE(?orderValue) AS ?order)
       (SAMPLE(?shipperValue) AS ?shipper)
       (SAMPLE(?shipperNameValue) AS ?shipperName)
       (SAMPLE(?orderDateValue) AS ?orderDate)
       (SAMPLE(?shippedDateValue) AS ?shippedDate)
       (SAMPLE(?shipCountryValue) AS ?shipCountry)
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?shipperValue a csv:shippers ;
                csv:shipperid ?shipperId ;
                csv:companyname ?shipperNameValue .
  ?orderValue a csv:orders ;
              csv:orderid ?orderId ;
              csv:shipvia ?shipperId ;
              csv:orderdate ?orderDateValue ;
              csv:shippeddate ?shippedDateValue ;
              csv:shipcountry ?shipCountryValue .
}
GROUP BY ?orderId
ORDER BY DESC(SAMPLE(?shippedDateValue))
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0A%0ASELECT+DISTINCT%0A+++++++%28SAMPLE%28%3ForderValue%29+AS+%3Forder%29%0A+++++++%28SAMPLE%28%3FshipperValue%29+AS+%3Fshipper%29%0A+++++++%28SAMPLE%28%3FshipperNameValue%29+AS+%3FshipperName%29%0A+++++++%28SAMPLE%28%3ForderDateValue%29+AS+%3ForderDate%29%0A+++++++%28SAMPLE%28%3FshippedDateValue%29+AS+%3FshippedDate%29%0A+++++++%28SAMPLE%28%3FshipCountryValue%29+AS+%3FshipCountry%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3FshipperValue+a+csv%3Ashippers+%3B%0A++++++++++++++++csv%3Ashipperid+%3FshipperId+%3B%0A++++++++++++++++csv%3Acompanyname+%3FshipperNameValue+.%0A++%3ForderValue+a+csv%3Aorders+%3B%0A++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A++++++++++++++csv%3Ashipvia+%3FshipperId+%3B%0A++++++++++++++csv%3Aorderdate+%3ForderDateValue+%3B%0A++++++++++++++csv%3Ashippeddate+%3FshippedDateValue+%3B%0A++++++++++++++csv%3Ashipcountry+%3FshipCountryValue+.%0A%7D%0AGROUP+BY+%3ForderId%0AORDER+BY+DESC%28SAMPLE%28%3FshippedDateValue%29%29%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryCustomerGrossSales a schema:SoftwareSourceCode ;
    schema:name "10. Customer Gross Sales with Traceable Orders"@en ;
    schema:description "Rank customer activity while retaining customer and sample-order IRIs for drill-through and provenance."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Cross-table aggregation"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?customer, ?sampleOrder" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT DISTINCT
       (SAMPLE(?customerValue) AS ?customer)
       (SAMPLE(?companyNameValue) AS ?companyName)
       (SAMPLE(?orderValue) AS ?sampleOrder)
       ?grossSales
FROM <urn:demo.csv:northwind:data>
WHERE {
  ?customerValue a csv:customers ;
                 csv:customerid ?customerId ;
                 csv:companyname ?companyNameValue .
  ?orderValue a csv:orders ;
              csv:customerid ?customerId .
  {
    SELECT ?customerId
           (SUM(xsd:decimal(?unitPrice) * xsd:decimal(?quantity)) AS ?grossSales)
    FROM <urn:demo.csv:northwind:data>
    WHERE {
      {
        SELECT DISTINCT ?customerId ?orderId ?productId ?unitPrice ?quantity
        FROM <urn:demo.csv:northwind:data>
        WHERE {
          ?salesOrder a csv:orders ;
                      csv:customerid ?customerId ;
                      csv:orderid ?orderId .
          ?salesDetail a csv:orders_details ;
                       csv:orderid ?orderId ;
                       csv:productid ?productId ;
                       csv:unitprice ?unitPrice ;
                       csv:quantity ?quantity .
        }
      }
    }
    GROUP BY ?customerId
  }
}
GROUP BY ?customerId ?grossSales
ORDER BY DESC(?grossSales)
LIMIT 15""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0APREFIX+xsd%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0A%0ASELECT+DISTINCT%0A+++++++%28SAMPLE%28%3FcustomerValue%29+AS+%3Fcustomer%29%0A+++++++%28SAMPLE%28%3FcompanyNameValue%29+AS+%3FcompanyName%29%0A+++++++%28SAMPLE%28%3ForderValue%29+AS+%3FsampleOrder%29%0A+++++++%3FgrossSales%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%3FcustomerValue+a+csv%3Acustomers+%3B%0A+++++++++++++++++csv%3Acustomerid+%3FcustomerId+%3B%0A+++++++++++++++++csv%3Acompanyname+%3FcompanyNameValue+.%0A++%3ForderValue+a+csv%3Aorders+%3B%0A++++++++++++++csv%3Acustomerid+%3FcustomerId+.%0A++%7B%0A++++SELECT+%3FcustomerId%0A+++++++++++%28SUM%28xsd%3Adecimal%28%3FunitPrice%29+%2A+xsd%3Adecimal%28%3Fquantity%29%29+AS+%3FgrossSales%29%0A++++FROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0A++++WHERE+%7B%0A++++++%7B%0A++++++++SELECT+DISTINCT+%3FcustomerId+%3ForderId+%3FproductId+%3FunitPrice+%3Fquantity%0A++++++++FROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0A++++++++WHERE+%7B%0A++++++++++%3FsalesOrder+a+csv%3Aorders+%3B%0A++++++++++++++++++++++csv%3Acustomerid+%3FcustomerId+%3B%0A++++++++++++++++++++++csv%3Aorderid+%3ForderId+.%0A++++++++++%3FsalesDetail+a+csv%3Aorders_details+%3B%0A+++++++++++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A+++++++++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A+++++++++++++++++++++++csv%3Aunitprice+%3FunitPrice+%3B%0A+++++++++++++++++++++++csv%3Aquantity+%3Fquantity+.%0A++++++++%7D%0A++++++%7D%0A++++%7D%0A++++GROUP+BY+%3FcustomerId%0A++%7D%0A%7D%0AGROUP+BY+%3FcustomerId+%3FgrossSales%0AORDER+BY+DESC%28%3FgrossSales%29%0ALIMIT+15&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryMonthlySalesTrend a schema:SoftwareSourceCode ;
    schema:name "11. Monthly Gross Sales Trend"@en ;
    schema:description "Track monthly order volume and gross sales while retaining a sample order IRI for drill-through."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Time-series analytics"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?sampleOrder" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT DISTINCT ?period
       (SAMPLE(?order) AS ?sampleOrder)
       (COUNT(DISTINCT ?orderId) AS ?orderCount)
       (SUM(xsd:decimal(?unitPrice) * xsd:decimal(?quantity)) AS ?grossSales)
FROM <urn:demo.csv:northwind:data>
WHERE {
  {
    SELECT ?orderId ?productId
           (SAMPLE(?orderValue) AS ?order)
           (SAMPLE(?orderDateValue) AS ?orderDate)
           (SAMPLE(?unitPriceValue) AS ?unitPrice)
           (SAMPLE(?quantityValue) AS ?quantity)
    FROM <urn:demo.csv:northwind:data>
    WHERE {
      ?orderValue a csv:orders ;
                  csv:orderid ?orderId ;
                  csv:orderdate ?orderDateValue .
      ?detailValue a csv:orders_details ;
                   csv:orderid ?orderId ;
                   csv:productid ?productId ;
                   csv:unitprice ?unitPriceValue ;
                   csv:quantity ?quantityValue .
    }
    GROUP BY ?orderId ?productId
  }
  BIND(SUBSTR(STR(?orderDate), 1, 7) AS ?period)
}
GROUP BY ?period
ORDER BY ?period
LIMIT 24""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0APREFIX+xsd%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0A%0ASELECT+DISTINCT+%3Fperiod%0A+++++++%28SAMPLE%28%3Forder%29+AS+%3FsampleOrder%29%0A+++++++%28COUNT%28DISTINCT+%3ForderId%29+AS+%3ForderCount%29%0A+++++++%28SUM%28xsd%3Adecimal%28%3FunitPrice%29+%2A+xsd%3Adecimal%28%3Fquantity%29%29+AS+%3FgrossSales%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%7B%0A++++SELECT+%3ForderId+%3FproductId%0A+++++++++++%28SAMPLE%28%3ForderValue%29+AS+%3Forder%29%0A+++++++++++%28SAMPLE%28%3ForderDateValue%29+AS+%3ForderDate%29%0A+++++++++++%28SAMPLE%28%3FunitPriceValue%29+AS+%3FunitPrice%29%0A+++++++++++%28SAMPLE%28%3FquantityValue%29+AS+%3Fquantity%29%0A++++FROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0A++++WHERE+%7B%0A++++++%3ForderValue+a+csv%3Aorders+%3B%0A++++++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A++++++++++++++++++csv%3Aorderdate+%3ForderDateValue+.%0A++++++%3FdetailValue+a+csv%3Aorders_details+%3B%0A+++++++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A+++++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A+++++++++++++++++++csv%3Aunitprice+%3FunitPriceValue+%3B%0A+++++++++++++++++++csv%3Aquantity+%3FquantityValue+.%0A++++%7D%0A++++GROUP+BY+%3ForderId+%3FproductId%0A++%7D%0A++BIND%28SUBSTR%28STR%28%3ForderDate%29%2C+1%2C+7%29+AS+%3Fperiod%29%0A%7D%0AGROUP+BY+%3Fperiod%0AORDER+BY+%3Fperiod%0ALIMIT+24&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryProductRevenueRanking a schema:SoftwareSourceCode ;
    schema:name "12. Product Revenue Ranking"@en ;
    schema:description "Rank products by gross sales and order reach while preserving a dereferenceable product IRI."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Product performance analytics"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?product" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT DISTINCT ?product ?productName
       (COUNT(DISTINCT ?orderId) AS ?orderCount)
       (SUM(xsd:decimal(?unitPrice) * xsd:decimal(?quantity)) AS ?grossSales)
FROM <urn:demo.csv:northwind:data>
WHERE {
  {
    SELECT ?productId
           (SAMPLE(?productValue) AS ?product)
           (SAMPLE(?productNameValue) AS ?productName)
    FROM <urn:demo.csv:northwind:data>
    WHERE {
      ?productValue a csv:products ;
                    csv:productid ?productId ;
                    csv:productname ?productNameValue .
    }
    GROUP BY ?productId
  }
  {
    SELECT ?orderId ?productId
           (SAMPLE(?unitPriceValue) AS ?unitPrice)
           (SAMPLE(?quantityValue) AS ?quantity)
    FROM <urn:demo.csv:northwind:data>
    WHERE {
      ?detailValue a csv:orders_details ;
                   csv:orderid ?orderId ;
                   csv:productid ?productId ;
                   csv:unitprice ?unitPriceValue ;
                   csv:quantity ?quantityValue .
    }
    GROUP BY ?orderId ?productId
  }
}
GROUP BY ?productId ?product ?productName
ORDER BY DESC(?grossSales)
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0APREFIX+xsd%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0A%0ASELECT+DISTINCT+%3Fproduct+%3FproductName%0A+++++++%28COUNT%28DISTINCT+%3ForderId%29+AS+%3ForderCount%29%0A+++++++%28SUM%28xsd%3Adecimal%28%3FunitPrice%29+%2A+xsd%3Adecimal%28%3Fquantity%29%29+AS+%3FgrossSales%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%7B%0A++++SELECT+%3FproductId%0A+++++++++++%28SAMPLE%28%3FproductValue%29+AS+%3Fproduct%29%0A+++++++++++%28SAMPLE%28%3FproductNameValue%29+AS+%3FproductName%29%0A++++FROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0A++++WHERE+%7B%0A++++++%3FproductValue+a+csv%3Aproducts+%3B%0A++++++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A++++++++++++++++++++csv%3Aproductname+%3FproductNameValue+.%0A++++%7D%0A++++GROUP+BY+%3FproductId%0A++%7D%0A++%7B%0A++++SELECT+%3ForderId+%3FproductId%0A+++++++++++%28SAMPLE%28%3FunitPriceValue%29+AS+%3FunitPrice%29%0A+++++++++++%28SAMPLE%28%3FquantityValue%29+AS+%3Fquantity%29%0A++++FROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0A++++WHERE+%7B%0A++++++%3FdetailValue+a+csv%3Aorders_details+%3B%0A+++++++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A+++++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A+++++++++++++++++++csv%3Aunitprice+%3FunitPriceValue+%3B%0A+++++++++++++++++++csv%3Aquantity+%3FquantityValue+.%0A++++%7D%0A++++GROUP+BY+%3ForderId+%3FproductId%0A++%7D%0A%7D%0AGROUP+BY+%3FproductId+%3Fproduct+%3FproductName%0AORDER+BY+DESC%28%3FgrossSales%29%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryEmployeeRevenueContribution a schema:SoftwareSourceCode ;
    schema:name "13. Employee Revenue Contribution"@en ;
    schema:description "Compare employee-attributed order volume and gross sales with employee and sample-order IRIs for drill-through."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Workforce performance analytics"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?employee, ?sampleOrder" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT DISTINCT ?employee ?firstName ?lastName
       (SAMPLE(?order) AS ?sampleOrder)
       (COUNT(DISTINCT ?orderId) AS ?orderCount)
       (SUM(xsd:decimal(?unitPrice) * xsd:decimal(?quantity)) AS ?grossSales)
FROM <urn:demo.csv:northwind:data>
WHERE {
  {
    SELECT ?employeeId
           (SAMPLE(?employeeValue) AS ?employee)
           (SAMPLE(?firstNameValue) AS ?firstName)
           (SAMPLE(?lastNameValue) AS ?lastName)
    FROM <urn:demo.csv:northwind:data>
    WHERE {
      ?employeeValue a csv:employees ;
                     csv:employeeid ?employeeId ;
                     csv:firstname ?firstNameValue ;
                     csv:lastname ?lastNameValue .
    }
    GROUP BY ?employeeId
  }
  {
    SELECT ?employeeId ?orderId ?productId
           (SAMPLE(?orderValue) AS ?order)
           (SAMPLE(?unitPriceValue) AS ?unitPrice)
           (SAMPLE(?quantityValue) AS ?quantity)
    FROM <urn:demo.csv:northwind:data>
    WHERE {
      ?orderValue a csv:orders ;
                  csv:employeeid ?employeeId ;
                  csv:orderid ?orderId .
      ?detailValue a csv:orders_details ;
                   csv:orderid ?orderId ;
                   csv:productid ?productId ;
                   csv:unitprice ?unitPriceValue ;
                   csv:quantity ?quantityValue .
    }
    GROUP BY ?employeeId ?orderId ?productId
  }
}
GROUP BY ?employeeId ?employee ?firstName ?lastName
ORDER BY DESC(?grossSales)
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0APREFIX+xsd%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0A%0ASELECT+DISTINCT+%3Femployee+%3FfirstName+%3FlastName%0A+++++++%28SAMPLE%28%3Forder%29+AS+%3FsampleOrder%29%0A+++++++%28COUNT%28DISTINCT+%3ForderId%29+AS+%3ForderCount%29%0A+++++++%28SUM%28xsd%3Adecimal%28%3FunitPrice%29+%2A+xsd%3Adecimal%28%3Fquantity%29%29+AS+%3FgrossSales%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%7B%0A++++SELECT+%3FemployeeId%0A+++++++++++%28SAMPLE%28%3FemployeeValue%29+AS+%3Femployee%29%0A+++++++++++%28SAMPLE%28%3FfirstNameValue%29+AS+%3FfirstName%29%0A+++++++++++%28SAMPLE%28%3FlastNameValue%29+AS+%3FlastName%29%0A++++FROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0A++++WHERE+%7B%0A++++++%3FemployeeValue+a+csv%3Aemployees+%3B%0A+++++++++++++++++++++csv%3Aemployeeid+%3FemployeeId+%3B%0A+++++++++++++++++++++csv%3Afirstname+%3FfirstNameValue+%3B%0A+++++++++++++++++++++csv%3Alastname+%3FlastNameValue+.%0A++++%7D%0A++++GROUP+BY+%3FemployeeId%0A++%7D%0A++%7B%0A++++SELECT+%3FemployeeId+%3ForderId+%3FproductId%0A+++++++++++%28SAMPLE%28%3ForderValue%29+AS+%3Forder%29%0A+++++++++++%28SAMPLE%28%3FunitPriceValue%29+AS+%3FunitPrice%29%0A+++++++++++%28SAMPLE%28%3FquantityValue%29+AS+%3Fquantity%29%0A++++FROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0A++++WHERE+%7B%0A++++++%3ForderValue+a+csv%3Aorders+%3B%0A++++++++++++++++++csv%3Aemployeeid+%3FemployeeId+%3B%0A++++++++++++++++++csv%3Aorderid+%3ForderId+.%0A++++++%3FdetailValue+a+csv%3Aorders_details+%3B%0A+++++++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A+++++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A+++++++++++++++++++csv%3Aunitprice+%3FunitPriceValue+%3B%0A+++++++++++++++++++csv%3Aquantity+%3FquantityValue+.%0A++++%7D%0A++++GROUP+BY+%3FemployeeId+%3ForderId+%3FproductId%0A++%7D%0A%7D%0AGROUP+BY+%3FemployeeId+%3Femployee+%3FfirstName+%3FlastName%0AORDER+BY+DESC%28%3FgrossSales%29%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

:queryDestinationCountrySales a schema:SoftwareSourceCode ;
    schema:name "14. Destination-Country Sales Performance"@en ;
    schema:description "Compare destination markets by order volume and gross sales while retaining a sample order IRI per country."@en ;
    schema:programmingLanguage "SPARQL" ;
    schema:codeSampleType "Geographic analytics"@en ;
    schema:keywords "entity IRI, hyperlink super key, conceptual data virtualization" ;
    schema:identifier "?sampleOrder" ;
    schema:comment "GROUP BY establishes the result grain and SAMPLE() selects one representative value per group; SELECT DISTINCT suppresses any repeated projected solutions."@en ;
    schema:targetProduct <http://dbpedia.org/resource/OpenLink_Virtuoso> ;
    schema:text """PREFIX csv: <http://demo.openlinksw.com/schemas/csv_northwind/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT DISTINCT ?country
       (SAMPLE(?order) AS ?sampleOrder)
       (COUNT(DISTINCT ?orderId) AS ?orderCount)
       (SUM(xsd:decimal(?unitPrice) * xsd:decimal(?quantity)) AS ?grossSales)
FROM <urn:demo.csv:northwind:data>
WHERE {
  {
    SELECT ?orderId ?productId
           (SAMPLE(?orderValue) AS ?order)
           (SAMPLE(?countryValue) AS ?country)
           (SAMPLE(?unitPriceValue) AS ?unitPrice)
           (SAMPLE(?quantityValue) AS ?quantity)
    FROM <urn:demo.csv:northwind:data>
    WHERE {
      ?orderValue a csv:orders ;
                  csv:orderid ?orderId ;
                  csv:shipcountry ?countryValue .
      ?detailValue a csv:orders_details ;
                   csv:orderid ?orderId ;
                   csv:productid ?productId ;
                   csv:unitprice ?unitPriceValue ;
                   csv:quantity ?quantityValue .
    }
    GROUP BY ?orderId ?productId
  }
}
GROUP BY ?country
ORDER BY DESC(?grossSales)
LIMIT 20""" ;
    schema:url "http://demo.openlinksw.com/sparql/?default-graph-uri=&query=PREFIX+csv%3A+%3Chttp%3A%2F%2Fdemo.openlinksw.com%2Fschemas%2Fcsv_northwind%2F%3E%0APREFIX+xsd%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0A%0ASELECT+DISTINCT+%3Fcountry%0A+++++++%28SAMPLE%28%3Forder%29+AS+%3FsampleOrder%29%0A+++++++%28COUNT%28DISTINCT+%3ForderId%29+AS+%3ForderCount%29%0A+++++++%28SUM%28xsd%3Adecimal%28%3FunitPrice%29+%2A+xsd%3Adecimal%28%3Fquantity%29%29+AS+%3FgrossSales%29%0AFROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0AWHERE+%7B%0A++%7B%0A++++SELECT+%3ForderId+%3FproductId%0A+++++++++++%28SAMPLE%28%3ForderValue%29+AS+%3Forder%29%0A+++++++++++%28SAMPLE%28%3FcountryValue%29+AS+%3Fcountry%29%0A+++++++++++%28SAMPLE%28%3FunitPriceValue%29+AS+%3FunitPrice%29%0A+++++++++++%28SAMPLE%28%3FquantityValue%29+AS+%3Fquantity%29%0A++++FROM+%3Curn%3Ademo.csv%3Anorthwind%3Adata%3E%0A++++WHERE+%7B%0A++++++%3ForderValue+a+csv%3Aorders+%3B%0A++++++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A++++++++++++++++++csv%3Ashipcountry+%3FcountryValue+.%0A++++++%3FdetailValue+a+csv%3Aorders_details+%3B%0A+++++++++++++++++++csv%3Aorderid+%3ForderId+%3B%0A+++++++++++++++++++csv%3Aproductid+%3FproductId+%3B%0A+++++++++++++++++++csv%3Aunitprice+%3FunitPriceValue+%3B%0A+++++++++++++++++++csv%3Aquantity+%3FquantityValue+.%0A++++%7D%0A++++GROUP+BY+%3ForderId+%3FproductId%0A++%7D%0A%7D%0AGROUP+BY+%3Fcountry%0AORDER+BY+DESC%28%3FgrossSales%29%0ALIMIT+20&format=text%2Fx-html%2Btr&timeout=0"^^<http://www.w3.org/2001/XMLSchema#anyURI> .

# ==============================================================================
# Live Query Verification and Machine-Computable Comparison Evidence
# ==============================================================================

:ComparisonObservation a owl:Class ;
    rdfs:label "Comparison Observation"@en ;
    rdfs:comment "One cell in the architecture comparison matrix."@en ;
    rdfs:isDefinedBy :VirtualizationOntology .

:evaluatesApproach a owl:ObjectProperty ;
    rdfs:label "evaluates approach"@en ;
    rdfs:domain :ComparisonObservation ;
    rdfs:range :IntegrationApproach ;
    rdfs:isDefinedBy :VirtualizationOntology .

:evaluatesDimension a owl:ObjectProperty ;
    rdfs:label "evaluates dimension"@en ;
    rdfs:domain :ComparisonObservation ;
    rdfs:range :ComparisonDimension ;
    rdfs:isDefinedBy :VirtualizationOntology .

:queryVerificationActivity a prov:Activity ;
    schema:name "Live Northwind SPARQL verification"@en ;
    schema:description "Execution of all 14 entity-IRI-bearing queries against the live Virtuoso endpoint and named graph."@en ;
    schema:startDate "2026-08-24"^^xsd:date ;
    schema:endDate "2026-08-24"^^xsd:date ;
    schema:target <http://demo.openlinksw.com/sparql/> ;
    prov:wasAssociatedWith :agentDataTwingler , :agentGpt5Codex ;
    prov:used <urn:demo.csv:northwind:data> ;
    prov:generated :queryVerificationReport .

:queryVerificationReport a schema:Dataset ;
    schema:name "Northwind live SPARQL verification report"@en ;
    schema:measurementTechnique "HTTP execution against a SPARQL 1.1 endpoint"@en ;
    schema:variableMeasured "HTTP status and returned binding or triple count"@en .

<http://demo.openlinksw.com/sparql/> a schema:EntryPoint ;
    schema:name "Virtuoso Northwind SPARQL endpoint"@en ;
    schema:url "http://demo.openlinksw.com/sparql/"^^xsd:anyURI .

<urn:demo.csv:northwind:data> a schema:Dataset ;
    schema:name "Virtualized Northwind named graph"@en .

:queryClassesAndCounts schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 11 bindings, 11 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryNorthwindCustomers schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 20 bindings, 20 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryProductsSuppliersJoin schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 20 bindings, 20 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryOrdersDetailsJoin schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 20 bindings, 20 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryCustomersByCountry schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 15 bindings, 15 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:querySchemaOrgConstruct schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 60 triples, 60 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under RDF graph set semantics."@en .

:queryCategoriesProducts schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 20 bindings, 20 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryEmployeesOrders schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 20 bindings, 20 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryShippersOrders schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 20 bindings, 20 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryCustomerGrossSales schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 15 bindings, 15 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryMonthlySalesTrend schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 23 bindings, 23 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryProductRevenueRanking schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 20 bindings, 20 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryEmployeeRevenueContribution schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 9 bindings, 9 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:queryDestinationCountrySales schema:target <http://demo.openlinksw.com/sparql/> ;
    schema:codeSampleType "live code" ;
    prov:wasGeneratedBy :queryVerificationActivity ;
    schema:comment "Verified live with HTTP 200; returned 20 bindings, 20 unique full results, 0 exact duplicates, and 0 repeated rows at the declared grain under GROUP BY + SAMPLE()."@en .

:observationD1A1 a :ComparisonObservation ;
    :evaluatesDimension :dimSpecificationModel ;
    :evaluatesApproach :approachYamlSemanticLayer ;
    schema:value "Proprietary YAML configuration files; tied to vendor-specific compilation engines."@en ;
    schema:position 1 .

:observationD1A2 a :ComparisonObservation ;
    :evaluatesDimension :dimSpecificationModel ;
    :evaluatesApproach :approachDedicatedGraphStore ;
    schema:value "Proprietary property graph schemas or custom DDL."@en ;
    schema:position 2 .

:observationD1A3 a :ComparisonObservation ;
    :evaluatesDimension :dimSpecificationModel ;
    :evaluatesApproach :approachConceptualVirtualization ;
    schema:value "100% W3C Open Standards: W3C R2RML, W3C RDF, OWL, and ANSI SQL."@en ;
    schema:position 3 .

:observationD2A1 a :ComparisonObservation ;
    :evaluatesDimension :dimEntityIdentity ;
    :evaluatesApproach :approachYamlSemanticLayer ;
    schema:value "Local string column/dimension names; no global web addressing or dereferencing."@en ;
    schema:position 4 .

:observationD2A2 a :ComparisonObservation ;
    :evaluatesDimension :dimEntityIdentity ;
    :evaluatesApproach :approachDedicatedGraphStore ;
    schema:value "Internal numeric/string node IDs; cluster-local scope."@en ;
    schema:position 5 .

:observationD2A3 a :ComparisonObservation ;
    :evaluatesDimension :dimEntityIdentity ;
    :evaluatesApproach :approachConceptualVirtualization ;
    schema:value "Global HTTP URI 'super keys' dereferenceable across organizational boundaries."@en ;
    schema:position 6 .

:observationD3A1 a :ComparisonObservation ;
    :evaluatesDimension :dimSemanticReasoning ;
    :evaluatesApproach :approachYamlSemanticLayer ;
    schema:value "Zero ontology reasoning; static metric calculations and fixed join paths."@en ;
    schema:position 7 .

:observationD3A2 a :ComparisonObservation ;
    :evaluatesDimension :dimSemanticReasoning ;
    :evaluatesApproach :approachDedicatedGraphStore ;
    schema:value "Limited to custom graph algorithms; no standard OWL/RDFS inferencing."@en ;
    schema:position 8 .

:observationD3A3 a :ComparisonObservation ;
    :evaluatesDimension :dimSemanticReasoning ;
    :evaluatesApproach :approachConceptualVirtualization ;
    schema:value "Full OWL/RDFS inferencing (`subClassOf`, `subPropertyOf`, `sameAs`) in real time."@en ;
    schema:position 9 .

:observationD4A1 a :ComparisonObservation ;
    :evaluatesDimension :dimQueryAlgebra ;
    :evaluatesApproach :approachYamlSemanticLayer ;
    schema:value "SQL code generation only; cannot execute graph pattern matching."@en ;
    schema:position 10 .

:observationD4A2 a :ComparisonObservation ;
    :evaluatesDimension :dimQueryAlgebra ;
    :evaluatesApproach :approachDedicatedGraphStore ;
    schema:value "Graph query only (Cypher/Gremlin); cannot execute standard SQL."@en ;
    schema:position 11 .

:observationD4A3 a :ComparisonObservation ;
    :evaluatesDimension :dimQueryAlgebra ;
    :evaluatesApproach :approachConceptualVirtualization ;
    schema:value "Simultaneous native SQL, SPARQL 1.1 graph queries, and hybrid SPASQL."@en ;
    schema:position 12 .

:observationD5A1 a :ComparisonObservation ;
    :evaluatesDimension :dimDataMovement ;
    :evaluatesApproach :approachYamlSemanticLayer ;
    schema:value "Requires building pre-aggregated tables or query federation over warehouse."@en ;
    schema:position 13 .

:observationD5A2 a :ComparisonObservation ;
    :evaluatesDimension :dimDataMovement ;
    :evaluatesApproach :approachDedicatedGraphStore ;
    schema:value "Full physical duplication into separate standalone database cluster."@en ;
    schema:position 14 .

:observationD5A3 a :ComparisonObservation ;
    :evaluatesDimension :dimDataMovement ;
    :evaluatesApproach :approachConceptualVirtualization ;
    schema:value "Zero replication; real-time query rewriting over live transactional tables."@en ;
    schema:position 15 .

:observationD6A1 a :ComparisonObservation ;
    :evaluatesDimension :dimAiAgentReadiness ;
    :evaluatesApproach :approachYamlSemanticLayer ;
    schema:value "Limited to Text-to-SQL over pre-defined metrics; hallucination prone."@en ;
    schema:position 16 .

:observationD6A2 a :ComparisonObservation ;
    :evaluatesDimension :dimAiAgentReadiness ;
    :evaluatesApproach :approachDedicatedGraphStore ;
    schema:value "Moderate; graph exploration possible but siloed from transactional RDBMS."@en ;
    schema:position 17 .

:observationD6A3 a :ComparisonObservation ;
    :evaluatesDimension :dimAiAgentReadiness ;
    :evaluatesApproach :approachConceptualVirtualization ;
    schema:value "High; machine-readable Knowledge Graph context with self-describing ontologies."@en ;
    schema:position 18 .

:observationD7A1 a :ComparisonObservation ;
    :evaluatesDimension :dimEcosystemIntegration ;
    :evaluatesApproach :approachYamlSemanticLayer ;
    schema:value "Requires vendor-specific BI plugins or semantic layer proxy."@en ;
    schema:position 19 .

:observationD7A2 a :ComparisonObservation ;
    :evaluatesDimension :dimEcosystemIntegration ;
    :evaluatesApproach :approachDedicatedGraphStore ;
    schema:value "Standard SQL/BI reporting tools cannot natively connect."@en ;
    schema:position 20 .

:observationD7A3 a :ComparisonObservation ;
    :evaluatesDimension :dimEcosystemIntegration ;
    :evaluatesApproach :approachConceptualVirtualization ;
    schema:value "Complete preservation of standard ODBC, JDBC, ADO.NET, and BI dashboards."@en ;
    schema:position 21 .

:observationD8A1 a :ComparisonObservation ;
    :evaluatesDimension :dimSchemaAgility ;
    :evaluatesApproach :approachYamlSemanticLayer ;
    schema:value "Schema changes require manually editing YAML files and re-deploying."@en ;
    schema:position 22 .

:observationD8A2 a :ComparisonObservation ;
    :evaluatesDimension :dimSchemaAgility ;
    :evaluatesApproach :approachDedicatedGraphStore ;
    schema:value "Schema changes require ETL pipeline updates and graph reload."@en ;
    schema:position 23 .

:observationD8A3 a :ComparisonObservation ;
    :evaluatesDimension :dimSchemaAgility ;
    :evaluatesApproach :approachConceptualVirtualization ;
    schema:value "Dynamic ontology evolution and multi-database VDB federation with zero downtime."@en ;
    schema:position 24 .

