From disagreeing claims to one explicit conclusion

Keep the disagreement. Make the decision explicit.

KG curated by kg-generator, rdf-infographic-skill, and GPT-6 on behalf of Kingsley Idehen
Executive Summary

Synopsis

Business meaning can emerge from operational evidence without reinventing its representation. Three systems describe win_rate differently. This demo keeps all three claims visible, records when each applies, and shows exactly how an explicit policy selects one current confidence score. The source data stays in SQL; R2RML exposes it as RDF at query time. A separate graph stores only the rule’s conclusion.

View this analysis as a KG entity
Section 1

1 · Discover meanings; inherit the standards

The article’s point is that local business meaning must be discovered, while its representation can use existing standards. Discovery alone does not decide which meaning an application should serve.

0

Keep disagreement visible

All closed opportunities, qualified opportunities and new-business pipeline define different denominators. An agent should see the competing formulas and their sources.

1

Distinguish the source from the sample

Atlan reports 32,237 claims reconciled into 14 entities, 79 metrics, 61 properties and 35 relationships. This demo’s SQL records and confidence values are synthetic; they are not the article’s measured data.

2

Dates preserve the past

A source and confidence score do not tell us when a claim stops applying. validFrom and validTo make that boundary inspectable.

3

Standards do not choose the policy

RDF, RDFS/OWL, SKOS and PROV-O provide shared representation. The explicit selection policy remains a business decision.

Section 2

2 · Three systems, three formulas

The same Opportunity / win_rate concept has three source claims. CRM’s 82% confidence expired on June 30. Cloud Warehouse’s 76% and BI Tool’s 65% remain open-ended and disagree. These are confidence scores about formulas, not measured sales win rates.

0

CRM · 82% · superseded

closed_won / all closed opportunities. Observed and valid from June 1, 2026; validTo June 30, 2026.

1

Cloud Warehouse · 76% · current

closed_won / closed opportunities excluding unqualified. Observed and valid from June 3, 2026; no validTo.

2

BI Tool · 65% · current

closed_won / new-business pipeline only. Observed and valid from June 5, 2026; no validTo.

3

Feedback is retained

The reviewer-feedback table records a later proposed confidence correction to the CRM claim. It does not silently overwrite the source claim or apply itself as a policy.

Section 3

3 · Real SQL underneath; R2RML above

Five existing aio_* SQL tables contain 15 sample rows: four source systems, four business entities, two metrics, four mined claims and one feedback record. The focused win_rate example uses three of those claims. Five explicit R2RML TriplesMaps expose 66 virtual triples.

0

Base tables remain the source

DDL and INSERT scripts reproduce the source rows. On demo.openlinksw.com those rows already existed and were reused after inspection; this revision did not recreate or duplicate them.

1

Mapping is real RDF

Every map explicitly carries a rr:TriplesMap type. rr:logicalTable, rr:subjectMap, rr:predicateObjectMap and parent-map joins reuse the shared aio: ontology terms.

2

Virtuoso generates the mapping

DB.DBA.R2RML_GENERATE_LINKED_VIEW(source, destination_graph, 0, 1) compiled the uploaded Turtle into a virtual RDF View. A dedicated storage imports that generated map; no handwritten table-to-triple Quad Map is used.

3

Regenerate without doubled data

Obtain RDF_VIEW_DROP_STMT_BY_GRAPH for this exact graph and execute its returned statements before regeneration. Verify the graph is empty before regenerating and returns to 66 triples afterward.

Section 4

4 · The same contradiction, three ways

Plain SQL, SPARQL, and SPASQL return the same three source claims. All three were executed through isql as well as ODBC. SPARQL’s source variable is unrestricted: it surfaces every source’s competing view, with validFrom and optional validTo.

0

SQL · ordinary joins

Join claims to business entity, business metric and source system. No RDF is involved.

1

SPARQL · the same facts

Query the RDF View and preserve CRM’s end date alongside the two open-ended claims. An explicit join-order hint avoids this server’s query-planning memory limit.

2

SPASQL · identical body

SELECT * FROM (SPARQL ...) AS claims embeds the exact standalone SPARQL query inside SQL. The browser link is a SPASQLQB permlink; execution remains a SQL-client operation.

3

Verification is inspectable

Captured isql, ODBC and HTTP results accompany the collection. The worked-example and DESCRIBE links were verified anonymously. SELECT links use text/x-html+tr; graph results use text/x-html-nice-turtle.

Three claims · verified live

Confidence in formula claims—not measured win rates. SQL, SPARQL and SPASQL each return the same three rows through isql.

CRMclosed_won / all closed opportunitiesSuperseded · ended 2026-06-30
82%
Cloud Warehouseclosed_won / closed opportunities excluding unqualifiedCurrent · open-ended
76%
BI Toolclosed_won / new-business pipeline onlyCurrent · open-ended
65%

Query the same evidence three ways

The same claims directly from SQL

Ordinary four-table join; no RDF involved. Scores are confidence in formula claims, not calculated win rates.

SELECT e.entity_name AS entity, m.metric_name AS metric, s.system_name AS source,
 c.formula_expression AS formula, c.confidence, c.observed_at AS observedAt,
 c.valid_from AS validFrom, c.valid_to AS validTo
FROM DB.kidehen.aio_mined_claim c
JOIN DB.kidehen.aio_business_entity e ON e.entity_id=c.entity_id
JOIN DB.kidehen.aio_business_metric m ON m.metric_id=c.metric_id
JOIN DB.kidehen.aio_source_system s ON s.system_id=c.source_system_id
WHERE m.metric_name='win_rate'
ORDER BY c.confidence DESC
Every source’s view, with validity

fromSystem is a variable, never a source restriction. The union preserves all three competing definitions and CRM’s expired interval.

DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
SELECT ?entity ?metric ?source ?formula ?confidence ?observedAt ?validFrom ?validTo
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
 ?claim a aio:MinedClaim; aio:aboutEntity ?entityIRI; aio:aboutMetric ?metricIRI;
   aio:fromSystem ?sourceIRI; aio:formulaExpression ?formula; aio:confidence ?confidence;
   aio:observedAt ?observedAt; aio:validFrom ?validFrom.
 ?entityIRI aio:entityName ?entity.
 ?metricIRI aio:metricName ?metric.
 ?sourceIRI aio:systemName ?source.
 FILTER(?metric = "win_rate")
 OPTIONAL { ?claim aio:validTo ?validTo }
}
ORDER BY DESC(?confidence)
Identical SPARQL inside SQL

Exactly the standalone SPARQL query embedded in a SQL SELECT. Execute through isql/ODBC/JDBC; the live button uses SPASQLQB.

SELECT * FROM (SPARQL
DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
SELECT ?entity ?metric ?source ?formula ?confidence ?observedAt ?validFrom ?validTo
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
 ?claim a aio:MinedClaim; aio:aboutEntity ?entityIRI; aio:aboutMetric ?metricIRI;
   aio:fromSystem ?sourceIRI; aio:formulaExpression ?formula; aio:confidence ?confidence;
   aio:observedAt ?observedAt; aio:validFrom ?validFrom.
 ?entityIRI aio:entityName ?entity.
 ?metricIRI aio:metricName ?metric.
 ?sourceIRI aio:systemName ?source.
 FILTER(?metric = "win_rate")
 OPTIONAL { ?claim aio:validTo ?validTo }
}
ORDER BY DESC(?confidence)
) AS claims
Section 5

5 · Classification versus reconciliation

First, keep every competing claim and give them a common label. Then, separately, ignore expired claims and choose the highest confidence among the claims already valid on September 8, 2026. That chooses 0.76 over 0.65. It records which confidence the policy prefers; it does not prove that one formula is universally correct.

0

Addendum A · classification

A six-triple-pattern CONSTRUCT head gives each of the three claims a shared type and five properties. It returns 18 triples and retains the disagreement. Under the requested single-head definition, this is not a Horn rule.

1

Addendum B · one head atom

The head is exactly ?metric aio:currentEstimate ?confidence. The body leaves sources unrestricted, uses OPTIONAL plus FILTER(!bound(?validTo)), checks validFrom against the stated date, and selects ORDER BY DESC(?confidence) LIMIT 1.

2

Be precise about Horn terminology

The conclusion has the required single-atom Horn-rule shape. The full operation adds absence testing and top-ranked selection to the conjunctive body; it is a policy-extended SPARQL rule, not pure positive Horn/Datalog.

3

Preview before writing

The complementary SELECT uses the same rule body and (aio:currentEstimate AS ?relation). It previews the identical subject, predicate and object before INSERT materializes that one conclusion.

Two worked examples: classify, then choose

First put the three claims under one common label. That keeps all three answers. Then set the expired CRM claim aside and choose the larger confidence score from the two remaining claims: 0.76. The choice follows the stated policy; it does not establish a universally correct win-rate formula.

Addendum A · Classification is not reconciliation

Six head triple patterns classify every disagreeing claim under one shared type. No winner is selected; this is not a Horn rule under the single-head definition.

DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
CONSTRUCT {
 ?claim a aio:HarmonizedWinRateClaim;
   aio:aboutMetric ?metricIRI;
   aio:formulaExpression ?formula;
   aio:confidence ?confidence;
   aio:fromSystem ?sourceIRI;
   aio:validFrom ?validFrom.
}
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
 ?claim a aio:MinedClaim; aio:aboutEntity ?entityIRI; aio:aboutMetric ?metricIRI;
   aio:fromSystem ?sourceIRI; aio:formulaExpression ?formula; aio:confidence ?confidence;
   aio:observedAt ?observedAt; aio:validFrom ?validFrom.
 ?entityIRI aio:entityName ?entity.
 ?metricIRI aio:metricName ?metric.
 ?sourceIRI aio:systemName ?source.
 FILTER(?metric = "win_rate")
 OPTIONAL { ?claim aio:validTo ?validTo }
}
Addendum B · One head triple, one stated policy

Ignore expired claims; among claims already valid on 2026-09-08, prefer the highest confidence. Cloud Warehouse 0.76 wins over BI Tool 0.65. Single-atom rule head; ORDER BY/LIMIT is an explicit ranking extension beyond pure Horn/Datalog.

DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
CONSTRUCT { ?metric aio:currentEstimate ?confidence . }
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
  SELECT ?metric ?confidence
  WHERE {
    ?claim a aio:MinedClaim; aio:aboutMetric ?metric; aio:confidence ?confidence;
      aio:validFrom ?validFrom.
    ?metric aio:metricName "win_rate".
    OPTIONAL { ?claim aio:validTo ?validTo }
    FILTER(!bound(?validTo))
    FILTER(?validFrom <= "2026-09-08"^^<http://www.w3.org/2001/XMLSchema#date>)
  }
  ORDER BY DESC(?confidence)
  LIMIT 1
}
Preview the exact triple before materializing

Same rule body and policy as Addendum B. SELECT exposes subject, predicate and object before any write.

DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
SELECT ?metric (aio:currentEstimate AS ?relation) ?confidence
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
  SELECT ?metric ?confidence
  WHERE {
    ?claim a aio:MinedClaim; aio:aboutMetric ?metric; aio:confidence ?confidence;
      aio:validFrom ?validFrom.
    ?metric aio:metricName "win_rate".
    OPTIONAL { ?claim aio:validTo ?validTo }
    FILTER(!bound(?validTo))
    FILTER(?validFrom <= "2026-09-08"^^<http://www.w3.org/2001/XMLSchema#date>)
  }
  ORDER BY DESC(?confidence)
  LIMIT 1
}

Technical precision: Addendum B has one head triple. Its absence test and ranking add policy operations beyond pure positive Horn/Datalog. Addendum A has six head patterns and only classifies.

Section 6

6 · One identifier, two complementary views

Inspect a raw MinedClaim directly from SQL through its RDF View. Then inspect the BusinessMetric across the virtual graph and a separate physical graph: its live type and name appear beside the rule’s stored currentEstimate 0.76.

0

Raw claim · RDF Views utility

Entity URLs under /ao26/aio now use scoped HTTP 303 rewrite rules. The raw claim DESCRIBE is a direct query over the virtual graph. Its description comes from SQL at query time, with no ETL or duplicate instance store.

1

Metric · live facts plus conclusion

The metric DESCRIBE has two FROM clauses: one for the RDF View and one for the derived graph. The materialized conclusion is Addendum B’s own single triple.

2

Observed virtual-write behavior

The test INSERT into the virtual graph returned success but the conclusion was invisible through the RDF View. A physical-only query found it underneath. That test triple was removed. Thus “nothing persisted” would be inaccurate on this instance; a separate derived graph avoids the hidden-write problem.

3

Public read, scoped to this demo

The virtual and derived graphs are readable anonymously. The HTTP SPARQL execution identities have SELECT only on the five underlying aio_* tables plus EXECUTE on the RDF value-conversion procedure required by the generated mapping.

Inspect one identifier at a time

These links show a different benefit from the rule examples: inspect a raw SQL-backed claim, then inspect the metric with both its live facts and its stored conclusion.

Inspect a raw claim at query time

Raw MinedClaim properties come directly from SQL through the RDF View; no ETL or duplicate instance store.

DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
DEFINE sql:describe-mode "CBD"
DESCRIBE <https://demo.openlinksw.com/ao26/aio/mined_claim/1#this>
FROM <https://demo.openlinksw.com/ao26/aio#>
One metric: live facts and the derived conclusion

Two FROM graphs combine live SQL-backed metric facts with Addendum B’s physically stored conclusion.

DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
DEFINE sql:describe-mode "CBD"
DESCRIBE <https://demo.openlinksw.com/ao26/aio/business_metric/1#this>
FROM <https://demo.openlinksw.com/ao26/aio#>
FROM <https://demo.openlinksw.com/ao26/aio-derived#>
BI Tool · entity identifierRaw claim · entity identifierMetric · entity identifier

Anonymous live checks returned 9 triples for the raw claim and 3 triples for the combined metric: type, metricName, and currentEstimate.

How-To

How-To Guide

1

Inspect existing SQL tables

Reuse exact existing sample rows on demo; the fresh-install DDL/INSERT script is only for an empty schema.

2

Publish the explicit mapping

Upload mapping.ttl to the documented authenticated DAV location. All five map subjects must be typed rr:TriplesMap.

3

Remove only the old graph mapping

Get and execute RDF_VIEW_DROP_STMT_BY_GRAPH for the exact target graph. Confirm no virtual triples remain.

4

Generate the RDF View

Call R2RML_GENERATE_LINKED_VIEW with graph_type 0 and clear_source_graph 1; import the generated container into the dedicated storage.

5

Run the same claims three ways

Execute SQL, SPARQL and the identical SPARQL wrapped in SQL through isql. Compare all eight columns and all three rows.

6

Preview and materialize the rule

Compare the singleton CONSTRUCT with its SELECT preview. Insert the conclusion into the separate derived graph.

7

Inspect both identifiers

Open the raw-claim DESCRIBE and the two-graph metric DESCRIBE. The latter must include type, metricName and currentEstimate.

Reproduce the data and mapping

The demo reuses the existing aio_* rows on demo.openlinksw.com. Use fresh-install SQL only on an empty schema. The deployment instructions separate table creation from safe RDF View regeneration.

Shared ontologyLive RDF exportDeployment instructions (local companion)Verification record (local companion)
Fresh-install DDL
-- Fresh installation only. Existing demo tables are reused, never dropped by this script.
CREATE TABLE DB.kidehen.aio_source_system (system_id INTEGER PRIMARY KEY, system_name VARCHAR(100), system_type VARCHAR(50));
CREATE TABLE DB.kidehen.aio_business_entity (entity_id INTEGER PRIMARY KEY, entity_name VARCHAR(100), entity_type VARCHAR(50));
CREATE TABLE DB.kidehen.aio_business_metric (metric_id INTEGER PRIMARY KEY, metric_name VARCHAR(100));
CREATE TABLE DB.kidehen.aio_mined_claim (claim_id INTEGER PRIMARY KEY, entity_id INTEGER, metric_id INTEGER, source_system_id INTEGER, formula_expression VARCHAR(500), confidence DOUBLE PRECISION, observed_at DATETIME, valid_from DATE, valid_to DATE);
CREATE TABLE DB.kidehen.aio_reviewer_feedback (feedback_id INTEGER PRIMARY KEY, claim_id INTEGER, reviewer VARCHAR(100), new_confidence DOUBLE PRECISION, reviewed_at DATETIME);
Download SQL
Sample INSERTs
-- Synthetic source data captured from the existing SQL tables. Fresh installation only.
INSERT INTO DB.kidehen.aio_source_system VALUES ('1', 'Cloud Warehouse', 'warehouse');
INSERT INTO DB.kidehen.aio_source_system VALUES ('2', 'CRM', 'crm');
INSERT INTO DB.kidehen.aio_source_system VALUES ('3', 'BI Tool', 'bi_tool');
INSERT INTO DB.kidehen.aio_source_system VALUES ('4', 'Metadata Catalog', 'catalog');
INSERT INTO DB.kidehen.aio_business_entity VALUES ('1', 'Opportunity', 'entity');
INSERT INTO DB.kidehen.aio_business_entity VALUES ('2', 'Deal', 'entity');
INSERT INTO DB.kidehen.aio_business_entity VALUES ('3', 'Pipeline', 'entity');
INSERT INTO DB.kidehen.aio_business_entity VALUES ('4', 'Customer', 'entity');
INSERT INTO DB.kidehen.aio_business_metric VALUES ('1', 'win_rate');
INSERT INTO DB.kidehen.aio_business_metric VALUES ('2', 'pipeline_value');
INSERT INTO DB.kidehen.aio_mined_claim VALUES ('1', '1', '1', '2', 'closed_won / all closed opportunities', '0.82', '2026-06-01 00:00:00', '2026-06-01', '2026-06-30');
INSERT INTO DB.kidehen.aio_mined_claim VALUES ('2', '1', '1', '1', 'closed_won / closed opportunities excluding unqualified', '0.76', '2026-06-03 00:00:00', '2026-06-03', NULL);
INSERT INTO DB.kidehen.aio_mined_claim VALUES ('3', '1', '1', '3', 'closed_won / new-business pipeline only', '0.65', '2026-06-05 00:00:00', '2026-06-05', NULL);
INSERT INTO DB.kidehen.aio_mined_claim VALUES ('4', '3', '2', '4', 'sum(open opportunity amount)', '0.9', '2026-06-02 00:00:00', '2026-06-02', NULL);
INSERT INTO DB.kidehen.aio_reviewer_feedback VALUES ('1', '1', 'data_steward_1', '0.55', '2026-07-01 00:00:00');
Download SQL
Safe R2RML regeneration
-- Safe regeneration. mapping.ttl must first be uploaded to the DAV path below.
-- Run as the authorized mapping owner. A fresh install creates the scoped storage;
-- this regeneration script assumes that storage already exists.
-- Capture these exact statements in your deployment log before executing them:
SELECT RDF_VIEW_DROP_STMT_BY_GRAPH('https://demo.openlinksw.com/ao26/aio#');
-- Exact statement returned for this deployment (captured in evidence).
-- Compare the SELECT output above before running it; if it differs, run the
-- returned statement(s) instead. This removes only this graph's generated map.
SPARQL DROP SILENT QUAD MAP <urn:qm:d78e349e1761bb3da216e0a81c651ce8475907a6> .;
SPARQL SELECT COUNT(*) FROM <https://demo.openlinksw.com/ao26/aio#> WHERE { ?s ?p ?o };
-- The preceding count must be zero. Physical facts in this graph must be reviewed
-- separately; do not erase them blindly. Never skip this verification.
DB.DBA.R2RML_GENERATE_LINKED_VIEW(
 'dav:/DAV/home/kidehen/rdf_sink/ao26-aio-r2rml.ttl',
 'https://demo.openlinksw.com/ao26/aio#', 0, 1);
SPARQL ALTER QUAD STORAGE <https://demo.openlinksw.com/ao26/aio/storage> {
 CREATE <urn:qm:d78e349e1761bb3da216e0a81c651ce8475907a6> USING STORAGE virtrdf:DefaultQuadStorage .
};
SPARQL DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
 SELECT COUNT(*) FROM <https://demo.openlinksw.com/ao26/aio#> WHERE { ?s ?p ?o };
Download SQL
Scope queries to the generated map
-- Imports generated mappings; this is not a hand-authored mapping.
SPARQL CREATE QUAD STORAGE <https://demo.openlinksw.com/ao26/aio/storage> {
 CREATE <urn:qm:d78e349e1761bb3da216e0a81c651ce8475907a6> USING STORAGE virtrdf:DefaultQuadStorage .
 CREATE virtrdf:DefaultQuadMap USING STORAGE virtrdf:DefaultQuadStorage .
};
Download SQL
Deploy resolvable entity identifiers
-- Scoped entity and graph routes. Existing authentication is preserved.
DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ao26_aio_metric', 1, '(/ao26/aio/business_metric/[0-9]+)', vector ('path'), 1, '/sparql?query=DEFINE%%20input%%3Astorage%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%2Fstorage%%3E%%0ADEFINE%%20sql%%3Adescribe-mode%%20%%22CBD%%22%%0ADESCRIBE%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%s%%23this%%3E%%0AFROM%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%23%%3E%%0AFROM%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio-derived%%23%%3E&format=text%%2Fx-html-nice-turtle', vector ('path'), NULL, NULL, 0, 303);

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ao26_aio_entity', 1, '(/ao26/aio/(?:source_system|business_entity|mined_claim|reviewer_feedback)/[0-9]+)', vector ('path'), 1, '/sparql?query=DEFINE%%20input%%3Astorage%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%2Fstorage%%3E%%0ADEFINE%%20sql%%3Adescribe-mode%%20%%22CBD%%22%%0ADESCRIBE%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%s%%23this%%3E%%0AFROM%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%23%%3E&format=text%%2Fx-html-nice-turtle', vector ('path'), NULL, NULL, 0, 303);

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ao26_aio_graph', 1, '^/ao26/aio/?$', vector (), 0, '/sparql?query=DEFINE%%20input%%3Astorage%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%2Fstorage%%3E%%0ACONSTRUCT%%20%%7B%%3Fs%%20%%3Fp%%20%%3Fo%%7D%%20FROM%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%23%%3E%%20WHERE%%20%%7B%%3Fs%%20%%3Fp%%20%%3Fo%%7D&format=text%%2Fx-html-nice-turtle', vector (), NULL, NULL, 0, 303);

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_rules', 1, vector ('ao26_aio_graph'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_source_system_rules', 1, vector ('ao26_aio_entity'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/source_system');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/source_system', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_source_system_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_business_entity_rules', 1, vector ('ao26_aio_entity'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/business_entity');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/business_entity', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_business_entity_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_business_metric_rules', 1, vector ('ao26_aio_metric'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/business_metric');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/business_metric', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_business_metric_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_mined_claim_rules', 1, vector ('ao26_aio_entity'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/mined_claim');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/mined_claim', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_mined_claim_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_reviewer_feedback_rules', 1, vector ('ao26_aio_entity'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/reviewer_feedback');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/reviewer_feedback', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_reviewer_feedback_rules'));
Download SQL
Materialize Addendum B
SPARQL
DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
INSERT { GRAPH <https://demo.openlinksw.com/ao26/aio-derived#> { ?metric aio:currentEstimate ?confidence . } }
WHERE {
 { SELECT ?metric ?confidence FROM <https://demo.openlinksw.com/ao26/aio#>
 WHERE {
  SELECT ?metric ?confidence
  WHERE {
    ?claim a aio:MinedClaim; aio:aboutMetric ?metric; aio:confidence ?confidence;
      aio:validFrom ?validFrom.
    ?metric aio:metricName "win_rate".
    OPTIONAL { ?claim aio:validTo ?validTo }
    FILTER(!bound(?validTo))
    FILTER(?validFrom <= "2026-09-08"^^<http://www.w3.org/2001/XMLSchema#date>)
  }
  ORDER BY DESC(?confidence)
  LIMIT 1
 } }
};
Download SQL
Consolidated fresh-install SQL batch
-- aio-batch.sql: fresh-install SQL for an empty schema.
-- Paste into an authenticated isql session; credentials are never embedded.
-- Prerequisites: R2RML VAD installed; shared ontology loaded; mapping.ttl uploaded
-- to dav:/DAV/home/kidehen/rdf_sink/ao26-aio-r2rml.ttl.
-- The SQL schema/data is reproducible; existing tables on demo were reused.
-- Fresh installation only. Existing demo tables are reused, never dropped by this script.
CREATE TABLE DB.kidehen.aio_source_system (system_id INTEGER PRIMARY KEY, system_name VARCHAR(100), system_type VARCHAR(50));
CREATE TABLE DB.kidehen.aio_business_entity (entity_id INTEGER PRIMARY KEY, entity_name VARCHAR(100), entity_type VARCHAR(50));
CREATE TABLE DB.kidehen.aio_business_metric (metric_id INTEGER PRIMARY KEY, metric_name VARCHAR(100));
CREATE TABLE DB.kidehen.aio_mined_claim (claim_id INTEGER PRIMARY KEY, entity_id INTEGER, metric_id INTEGER, source_system_id INTEGER, formula_expression VARCHAR(500), confidence DOUBLE PRECISION, observed_at DATETIME, valid_from DATE, valid_to DATE);
CREATE TABLE DB.kidehen.aio_reviewer_feedback (feedback_id INTEGER PRIMARY KEY, claim_id INTEGER, reviewer VARCHAR(100), new_confidence DOUBLE PRECISION, reviewed_at DATETIME);
-- Synthetic source data captured from the existing SQL tables. Fresh installation only.
INSERT INTO DB.kidehen.aio_source_system VALUES ('1', 'Cloud Warehouse', 'warehouse');
INSERT INTO DB.kidehen.aio_source_system VALUES ('2', 'CRM', 'crm');
INSERT INTO DB.kidehen.aio_source_system VALUES ('3', 'BI Tool', 'bi_tool');
INSERT INTO DB.kidehen.aio_source_system VALUES ('4', 'Metadata Catalog', 'catalog');
INSERT INTO DB.kidehen.aio_business_entity VALUES ('1', 'Opportunity', 'entity');
INSERT INTO DB.kidehen.aio_business_entity VALUES ('2', 'Deal', 'entity');
INSERT INTO DB.kidehen.aio_business_entity VALUES ('3', 'Pipeline', 'entity');
INSERT INTO DB.kidehen.aio_business_entity VALUES ('4', 'Customer', 'entity');
INSERT INTO DB.kidehen.aio_business_metric VALUES ('1', 'win_rate');
INSERT INTO DB.kidehen.aio_business_metric VALUES ('2', 'pipeline_value');
INSERT INTO DB.kidehen.aio_mined_claim VALUES ('1', '1', '1', '2', 'closed_won / all closed opportunities', '0.82', '2026-06-01 00:00:00', '2026-06-01', '2026-06-30');
INSERT INTO DB.kidehen.aio_mined_claim VALUES ('2', '1', '1', '1', 'closed_won / closed opportunities excluding unqualified', '0.76', '2026-06-03 00:00:00', '2026-06-03', NULL);
INSERT INTO DB.kidehen.aio_mined_claim VALUES ('3', '1', '1', '3', 'closed_won / new-business pipeline only', '0.65', '2026-06-05 00:00:00', '2026-06-05', NULL);
INSERT INTO DB.kidehen.aio_mined_claim VALUES ('4', '3', '2', '4', 'sum(open opportunity amount)', '0.9', '2026-06-02 00:00:00', '2026-06-02', NULL);
INSERT INTO DB.kidehen.aio_reviewer_feedback VALUES ('1', '1', 'data_steward_1', '0.55', '2026-07-01 00:00:00');

DB.DBA.TTLP('@prefix aio: <http://demo.openlinksw.com/schemas/aiontology/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema1: <http://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

aio:HarmonizedWinRateClaim a owl:Class ;
    rdfs:label "Harmonized Win-Rate Claim"@en ;
    rdfs:comment "Asserted, VERIFIED live via a CONSTRUCT query used as a custom inference rule, over every aio:MinedClaim whose metric is win_rate -- one shared type spanning three disparate source-system formulas, without discarding each claim''s own confidence, fromSystem, or validity."@en ;
    rdfs:isDefinedBy aio: ;
    rdfs:subClassOf aio:MinedClaim .

aio:aboutEntity a owl:ObjectProperty ;
    rdfs:domain aio:MinedClaim ;
    rdfs:isDefinedBy aio: ;
    rdfs:range aio:BusinessEntity .

aio:aboutMetric a owl:ObjectProperty ;
    rdfs:domain aio:MinedClaim ;
    rdfs:isDefinedBy aio: ;
    rdfs:range aio:BusinessMetric .

aio:confidence a owl:DatatypeProperty ;
    rdfs:domain aio:MinedClaim ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:float .

aio:currentEstimate a owl:DatatypeProperty ;
    rdfs:label "current estimate"@en ;
    rdfs:comment "Confidence selected by the stated current-claim ranking policy; not a measured sales win rate. The rule head has one triple; ranking is an explicit extension beyond pure Horn logic." ;
    rdfs:domain aio:BusinessMetric ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:float .

aio:entityName a owl:DatatypeProperty ;
    rdfs:domain aio:BusinessEntity ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:string ;
    owl:equivalentProperty skos:prefLabel .

aio:entityType a owl:DatatypeProperty ;
    rdfs:domain aio:BusinessEntity ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:string .

aio:feedbackOn a owl:ObjectProperty ;
    rdfs:domain aio:ReviewerFeedback ;
    rdfs:isDefinedBy aio: ;
    rdfs:range aio:MinedClaim .

aio:formulaExpression a owl:DatatypeProperty ;
    rdfs:comment "The literal formula this source system used to compute the metric — the direct cause of the article''s win-rate contradiction."@en ;
    rdfs:domain aio:MinedClaim ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:string .

aio:fromSystem a owl:ObjectProperty ;
    rdfs:comment "Reuses PROV-O rather than inventing a bespoke provenance predicate, per the article''s recommended path forward."@en ;
    rdfs:domain aio:MinedClaim ;
    rdfs:isDefinedBy aio: ;
    rdfs:range aio:SourceSystem ;
    owl:equivalentProperty prov:wasDerivedFrom .

aio:metricName a owl:DatatypeProperty ;
    rdfs:domain aio:BusinessMetric ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:string ;
    owl:equivalentProperty skos:prefLabel .

aio:newConfidence a owl:DatatypeProperty ;
    rdfs:domain aio:ReviewerFeedback ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:float .

aio:observedAt a owl:DatatypeProperty ;
    rdfs:domain aio:MinedClaim ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:dateTime .

aio:reviewedAt a owl:DatatypeProperty ;
    rdfs:domain aio:ReviewerFeedback ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:dateTime .

aio:reviewer a owl:DatatypeProperty ;
    rdfs:domain aio:ReviewerFeedback ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:string .

aio:systemName a owl:DatatypeProperty ;
    rdfs:domain aio:SourceSystem ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:string ;
    owl:equivalentProperty skos:prefLabel .

aio:systemType a owl:DatatypeProperty ;
    rdfs:domain aio:SourceSystem ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:string .

aio:validFrom a owl:DatatypeProperty ;
    rdfs:comment "The temporal-validity interval the article''s own claim structure was missing."@en ;
    rdfs:domain aio:MinedClaim ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:date .

aio:validTo a owl:DatatypeProperty ;
    rdfs:domain aio:MinedClaim ;
    rdfs:isDefinedBy aio: ;
    rdfs:range xsd:date .

aio:BusinessEntity a owl:Class ;
    rdfs:label "Business Entity"@en ;
    rdfs:isDefinedBy aio: .

aio:BusinessMetric a owl:Class ;
    rdfs:label "Business Metric"@en ;
    rdfs:isDefinedBy aio: .

aio:SourceSystem a owl:Class ;
    rdfs:label "Source System"@en ;
    rdfs:comment "One of the systems a claim was mined from (warehouse, CRM, BI tool, metadata catalog)."@en ;
    rdfs:isDefinedBy aio: .

aio:ReviewerFeedback a owl:Class ;
    rdfs:label "Reviewer Feedback"@en ;
    rdfs:comment "A human review that revises a claim''s confidence after the fact."@en ;
    rdfs:isDefinedBy aio: .

aio:MinedClaim a owl:Class ;
    rdfs:label "Mined Claim"@en ;
    rdfs:comment "A reified assertion about a business metric''s definition for a business entity, as observed in one source system."@en ;
    rdfs:isDefinedBy aio: .

aio: a owl:Ontology ;
    schema1:description "Shared business-claims vocabulary reused by the R2RML mapping. The live ontology graph is http://demo.openlinksw.com/schemas/aiontology." ;
    schema1:name "AI Ontology Bottom-Up Demo Ontology"@en ;
    rdfs:comment "Minted for a Virtuoso RDF Views demonstration of Emily Winks'' ''AI Ontology: Bottom-Up Doesn''t Mean Starting From Scratch'' (Atlan, Context & Chaos, 2026-09-04): local business terms discovered bottom-up from SQL tables, represented using inherited standards (PROV-O, Dublin Core, SKOS, SHACL) rather than reinvented from scratch."@en .

', '', 'http://demo.openlinksw.com/schemas/aiontology');

DB.DBA.R2RML_GENERATE_LINKED_VIEW('dav:/DAV/home/kidehen/rdf_sink/ao26-aio-r2rml.ttl', 'https://demo.openlinksw.com/ao26/aio#', 0, 1);
-- Imports generated mappings; this is not a hand-authored mapping.
SPARQL CREATE QUAD STORAGE <https://demo.openlinksw.com/ao26/aio/storage> {
 CREATE <urn:qm:d78e349e1761bb3da216e0a81c651ce8475907a6> USING STORAGE virtrdf:DefaultQuadStorage .
 CREATE virtrdf:DefaultQuadMap USING STORAGE virtrdf:DefaultQuadStorage .
};
SPARQL
DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
INSERT { GRAPH <https://demo.openlinksw.com/ao26/aio-derived#> { ?metric aio:currentEstimate ?confidence . } }
WHERE {
 { SELECT ?metric ?confidence FROM <https://demo.openlinksw.com/ao26/aio#>
 WHERE {
  SELECT ?metric ?confidence
  WHERE {
    ?claim a aio:MinedClaim; aio:aboutMetric ?metric; aio:confidence ?confidence;
      aio:validFrom ?validFrom.
    ?metric aio:metricName "win_rate".
    OPTIONAL { ?claim aio:validTo ?validTo }
    FILTER(!bound(?validTo))
    FILTER(?validFrom <= "2026-09-08"^^<http://www.w3.org/2001/XMLSchema#date>)
  }
  ORDER BY DESC(?confidence)
  LIMIT 1
 } }
};



-- Scoped entity and graph routes. Existing authentication is preserved.
DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ao26_aio_metric', 1, '(/ao26/aio/business_metric/[0-9]+)', vector ('path'), 1, '/sparql?query=DEFINE%%20input%%3Astorage%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%2Fstorage%%3E%%0ADEFINE%%20sql%%3Adescribe-mode%%20%%22CBD%%22%%0ADESCRIBE%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%s%%23this%%3E%%0AFROM%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%23%%3E%%0AFROM%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio-derived%%23%%3E&format=text%%2Fx-html-nice-turtle', vector ('path'), NULL, NULL, 0, 303);

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ao26_aio_entity', 1, '(/ao26/aio/(?:source_system|business_entity|mined_claim|reviewer_feedback)/[0-9]+)', vector ('path'), 1, '/sparql?query=DEFINE%%20input%%3Astorage%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%2Fstorage%%3E%%0ADEFINE%%20sql%%3Adescribe-mode%%20%%22CBD%%22%%0ADESCRIBE%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%s%%23this%%3E%%0AFROM%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%23%%3E&format=text%%2Fx-html-nice-turtle', vector ('path'), NULL, NULL, 0, 303);

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ao26_aio_graph', 1, '^/ao26/aio/?$', vector (), 0, '/sparql?query=DEFINE%%20input%%3Astorage%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%2Fstorage%%3E%%0ACONSTRUCT%%20%%7B%%3Fs%%20%%3Fp%%20%%3Fo%%7D%%20FROM%%20%%3Chttps%%3A%%2F%%2Fdemo.openlinksw.com%%2Fao26%%2Faio%%23%%3E%%20WHERE%%20%%7B%%3Fs%%20%%3Fp%%20%%3Fo%%7D&format=text%%2Fx-html-nice-turtle', vector (), NULL, NULL, 0, 303);

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_rules', 1, vector ('ao26_aio_graph'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_source_system_rules', 1, vector ('ao26_aio_entity'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/source_system');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/source_system', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_source_system_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_business_entity_rules', 1, vector ('ao26_aio_entity'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/business_entity');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/business_entity', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_business_entity_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_business_metric_rules', 1, vector ('ao26_aio_metric'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/business_metric');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/business_metric', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_business_metric_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_mined_claim_rules', 1, vector ('ao26_aio_entity'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/mined_claim');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/mined_claim', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_mined_claim_rules'));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ao26_aio_reviewer_feedback_rules', 1, vector ('ao26_aio_entity'));

DB.DBA.VHOST_REMOVE (lpath=>'/ao26/aio/reviewer_feedback');

DB.DBA.VHOST_DEFINE (lpath=>'/ao26/aio/reviewer_feedback', ppath=>'/DAV/home/kidehen/rdf_sink/', is_dav=>1, vsp_user=>'kidehen', is_brws=>0, opts=>vector ('url_rewrite', 'ao26_aio_reviewer_feedback_rules'));

-- Public read access for the worked examples.
UPDATE DB.DBA.SYS_USERS SET U_ACCOUNT_DISABLED = 0
 WHERE U_ID = 100 AND U_NAME = 'SPARQL_SELECT' AND U_ACCOUNT_DISABLED = 1;
DB.DBA.RDF_GRAPH_USER_PERMS_SET ('https://demo.openlinksw.com/ao26/aio#', 'nobody', 1);
DB.DBA.RDF_GRAPH_USER_PERMS_SET ('https://demo.openlinksw.com/ao26/aio-derived#', 'nobody', 1);
DB.DBA.RDF_GRAPH_USER_PERMS_SET ('https://demo.openlinksw.com/ao26/aio#', 'SPARQL', 1);
DB.DBA.RDF_GRAPH_USER_PERMS_SET ('https://demo.openlinksw.com/ao26/aio-derived#', 'SPARQL', 1);
DB.DBA.RDF_GRAPH_USER_PERMS_SET ('https://demo.openlinksw.com/ao26/aio#', 'SPARQL_SELECT', 1);
DB.DBA.RDF_GRAPH_USER_PERMS_SET ('https://demo.openlinksw.com/ao26/aio-derived#', 'SPARQL_SELECT', 1);
GRANT SELECT ON DB.kidehen.aio_business_entity TO nobody;
GRANT SELECT ON DB.kidehen.aio_business_metric TO nobody;
GRANT SELECT ON DB.kidehen.aio_mined_claim TO nobody;
GRANT SELECT ON DB.kidehen.aio_source_system TO nobody;
GRANT SELECT ON DB.kidehen.aio_reviewer_feedback TO nobody;
GRANT EXECUTE ON DB.DBA.RDF_MAKE_LONG_OF_SQLVAL TO nobody;
GRANT SELECT ON DB.kidehen.aio_business_entity TO "SPARQL";
GRANT SELECT ON DB.kidehen.aio_business_metric TO "SPARQL";
GRANT SELECT ON DB.kidehen.aio_mined_claim TO "SPARQL";
GRANT SELECT ON DB.kidehen.aio_source_system TO "SPARQL";
GRANT SELECT ON DB.kidehen.aio_reviewer_feedback TO "SPARQL";
GRANT EXECUTE ON DB.DBA.RDF_MAKE_LONG_OF_SQLVAL TO "SPARQL";
GRANT SELECT ON DB.kidehen.aio_business_entity TO "SPARQL_SELECT";
GRANT SELECT ON DB.kidehen.aio_business_metric TO "SPARQL_SELECT";
GRANT SELECT ON DB.kidehen.aio_mined_claim TO "SPARQL_SELECT";
GRANT SELECT ON DB.kidehen.aio_source_system TO "SPARQL_SELECT";
GRANT SELECT ON DB.kidehen.aio_reviewer_feedback TO "SPARQL_SELECT";
GRANT EXECUTE ON DB.DBA.RDF_MAKE_LONG_OF_SQLVAL TO "SPARQL_SELECT";
UPDATE DB.DBA.SYS_USERS SET U_ACCOUNT_DISABLED = 1
 WHERE U_ID = 100 AND U_NAME = 'SPARQL_SELECT';
Download SQL
Explicit R2RML · five typed TriplesMaps
@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix aio: <http://demo.openlinksw.com/schemas/aiontology/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<#SourceSystemMap> a rr:TriplesMap ;
    rr:logicalTable [ rr:tableName "DB.kidehen.aio_source_system" ] ;
    rr:subjectMap [
        rr:template "https://demo.openlinksw.com/ao26/aio/source_system/{system_id}#this" ;
        rr:class aio:SourceSystem ;
    ] ;
    rr:predicateObjectMap [ rr:predicate aio:systemName ; rr:objectMap [ rr:column "system_name" ] ] ;
    rr:predicateObjectMap [ rr:predicate aio:systemType ; rr:objectMap [ rr:column "system_type" ] ] .

<#BusinessEntityMap> a rr:TriplesMap ;
    rr:logicalTable [ rr:tableName "DB.kidehen.aio_business_entity" ] ;
    rr:subjectMap [
        rr:template "https://demo.openlinksw.com/ao26/aio/business_entity/{entity_id}#this" ;
        rr:class aio:BusinessEntity ;
    ] ;
    rr:predicateObjectMap [ rr:predicate aio:entityName ; rr:objectMap [ rr:column "entity_name" ] ] ;
    rr:predicateObjectMap [ rr:predicate aio:entityType ; rr:objectMap [ rr:column "entity_type" ] ] .

<#BusinessMetricMap> a rr:TriplesMap ;
    rr:logicalTable [ rr:tableName "DB.kidehen.aio_business_metric" ] ;
    rr:subjectMap [
        rr:template "https://demo.openlinksw.com/ao26/aio/business_metric/{metric_id}#this" ;
        rr:class aio:BusinessMetric ;
    ] ;
    rr:predicateObjectMap [ rr:predicate aio:metricName ; rr:objectMap [ rr:column "metric_name" ] ] .

<#MinedClaimMap> a rr:TriplesMap ;
    rr:logicalTable [ rr:tableName "DB.kidehen.aio_mined_claim" ] ;
    rr:subjectMap [
        rr:template "https://demo.openlinksw.com/ao26/aio/mined_claim/{claim_id}#this" ;
        rr:class aio:MinedClaim ;
    ] ;
    rr:predicateObjectMap [ rr:predicate aio:formulaExpression ; rr:objectMap [ rr:column "formula_expression" ] ] ;
    rr:predicateObjectMap [ rr:predicate aio:confidence ; rr:objectMap [ rr:column "confidence" ; rr:datatype xsd:float ] ] ;
    rr:predicateObjectMap [ rr:predicate aio:observedAt ; rr:objectMap [ rr:column "observed_at" ; rr:datatype xsd:dateTime ] ] ;
    rr:predicateObjectMap [ rr:predicate aio:validFrom ; rr:objectMap [ rr:column "valid_from" ; rr:datatype xsd:date ] ] ;
    rr:predicateObjectMap [ rr:predicate aio:validTo ; rr:objectMap [ rr:column "valid_to" ; rr:datatype xsd:date ] ] ;
    rr:predicateObjectMap [
        rr:predicate aio:aboutEntity ;
        rr:objectMap [ rr:parentTriplesMap <#BusinessEntityMap> ;
                       rr:joinCondition [ rr:child "entity_id" ; rr:parent "entity_id" ] ] ;
    ] ;
    rr:predicateObjectMap [
        rr:predicate aio:aboutMetric ;
        rr:objectMap [ rr:parentTriplesMap <#BusinessMetricMap> ;
                       rr:joinCondition [ rr:child "metric_id" ; rr:parent "metric_id" ] ] ;
    ] ;
    rr:predicateObjectMap [
        rr:predicate aio:fromSystem ;
        rr:objectMap [ rr:parentTriplesMap <#SourceSystemMap> ;
                       rr:joinCondition [ rr:child "source_system_id" ; rr:parent "system_id" ] ] ;
    ] .

<#ReviewerFeedbackMap> a rr:TriplesMap ;
    rr:logicalTable [ rr:tableName "DB.kidehen.aio_reviewer_feedback" ] ;
    rr:subjectMap [
        rr:template "https://demo.openlinksw.com/ao26/aio/reviewer_feedback/{feedback_id}#this" ;
        rr:class aio:ReviewerFeedback ;
    ] ;
    rr:predicateObjectMap [ rr:predicate aio:reviewer ; rr:objectMap [ rr:column "reviewer" ] ] ;
    rr:predicateObjectMap [ rr:predicate aio:newConfidence ; rr:objectMap [ rr:column "new_confidence" ; rr:datatype xsd:float ] ] ;
    rr:predicateObjectMap [ rr:predicate aio:reviewedAt ; rr:objectMap [ rr:column "reviewed_at" ; rr:datatype xsd:dateTime ] ] ;
    rr:predicateObjectMap [
        rr:predicate aio:feedbackOn ;
        rr:objectMap [ rr:parentTriplesMap <#MinedClaimMap> ;
                       rr:joinCondition [ rr:child "claim_id" ; rr:parent "claim_id" ] ] ;
    ] .
Download mapping
FAQ

Frequently Asked Questions

No. They are synthetic confidence scores attached to three different formula claims. The rule selects a confidence score.

No. Those exact tables and rows already existed on the selected server. This revision verified and reused them, and supplies reproducible DDL and INSERT scripts.

The RDF View can hide physical writes to its graph. A separate derived graph makes the stored conclusion explicitly queryable beside virtual facts.

Yes. Anonymous HTTP checks returned 200 for both worked examples, the rule preview, the raw claim DESCRIBE and the combined metric DESCRIBE.

No. It demonstrates representation and reconciliation after discovery.

The mapping is itself RDF and uses a standard vocabulary. Virtuoso compiles it into its native virtual mapping.

No. They are computed from SQL. The downloadable RDF snapshot is an offline evidence export, not the live data source.

Discovery must preserve history. The raw comparison shows all claims; the separate rule excludes expired ones.

No. Addendum A keeps all three claims. Addendum B chooses one confidence using an explicit policy.

No. Its head is a single atom, but absence testing and ranking are extensions. The document makes those policy choices explicit.

This sample has a unique maximum. Equal maxima yield the same confidence conclusion; selecting source provenance as well would require a further tie-breaker.

Open-ended validity. The rule also checks that validFrom has arrived on the stated as-of date. Future scheduled end dates would require a different interval policy.

Glossary

Glossary of Terms

Mined claim

A sourced assertion about a business metric’s formula.

Business metric

The concept whose definitions may differ across source systems.

Confidence

A score attached to a claim, distinct from the business metric’s measured value.

R2RML

RDF vocabulary for mapping relational data to RDF.

RDF View

A graph computed from SQL rows at query time.

Temporal validity

The interval in which a claim applies.

SPASQL

SPARQL embedded in SQL and executed by a SQL client.

Single-head rule

A rule with one conclusion atom; here, one CONSTRUCT triple pattern.

Reconciliation policy

An explicit choice about which competing current claim to prefer.

Derived graph

A separate physical graph storing the rule’s conclusion.

Knowledge Graph Explorer 175 nodes · 422 links

Interactive graph visualization derived from the companion RDF. Click nodes to resolve, drag to explore. Graph data embedded from companion RDF at generation time.

From disagreeing claims to one explicit conclusion

Nodes: 0 Links: 0
Click SVG to activate zoom, click outside to release | Drag nodes to pin, double-click to unpin
Classes Properties Instances

SPARQL Workbench 15 sample queries

Query this knowledge graph on URIBurner. The editor opens on the canonical SAMPLE entity-type summary (DAV named graph). Pick a recipe, edit freely, then run live or copy.

Sample Queries

Reproduced verbatim from the companion RDF. Execute loads the query into the workbench below and runs it live.

Addendum A · Classification is not reconciliation
DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
CONSTRUCT {
 ?claim a aio:HarmonizedWinRateClaim;
   aio:aboutMetric ?metricIRI;
   aio:formulaExpression ?formula;
   aio:confidence ?confidence;
   aio:fromSystem ?sourceIRI;
   aio:validFrom ?validFrom.
}
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
 ?claim a aio:MinedClaim; aio:aboutEntity ?entityIRI; aio:aboutMetric ?metricIRI;
   aio:fromSystem ?sourceIRI; aio:formulaExpression ?formula; aio:confidence ?confidence;
   aio:observedAt ?observedAt; aio:validFrom ?validFrom.
 ?entityIRI aio:entityName ?entity.
 ?metricIRI aio:metricName ?metric.
 ?sourceIRI aio:systemName ?source.
 FILTER(?metric = "win_rate")
 OPTIONAL { ?claim aio:validTo ?validTo }
}

Six head triple patterns classify every disagreeing claim under one shared type. No winner is selected; this is not a Horn rule under the single-head definition.

Addendum B · One head triple, one stated policy
DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
CONSTRUCT { ?metric aio:currentEstimate ?confidence . }
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
  SELECT ?metric ?confidence
  WHERE {
    ?claim a aio:MinedClaim; aio:aboutMetric ?metric; aio:confidence ?confidence;
      aio:validFrom ?validFrom.
    ?metric aio:metricName "win_rate".
    OPTIONAL { ?claim aio:validTo ?validTo }
    FILTER(!bound(?validTo))
    FILTER(?validFrom <= "2026-09-08"^^<http://www.w3.org/2001/XMLSchema#date>)
  }
  ORDER BY DESC(?confidence)
  LIMIT 1
}

Ignore expired claims; among claims already valid on 2026-09-08, prefer the highest confidence. Cloud Warehouse 0.76 wins over BI Tool 0.65. Single-atom rule head; ORDER BY/LIMIT is an explicit ranking extension beyond pure Horn/Datalog.

Every source’s view, with validity
DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
SELECT ?entity ?metric ?source ?formula ?confidence ?observedAt ?validFrom ?validTo
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
 ?claim a aio:MinedClaim; aio:aboutEntity ?entityIRI; aio:aboutMetric ?metricIRI;
   aio:fromSystem ?sourceIRI; aio:formulaExpression ?formula; aio:confidence ?confidence;
   aio:observedAt ?observedAt; aio:validFrom ?validFrom.
 ?entityIRI aio:entityName ?entity.
 ?metricIRI aio:metricName ?metric.
 ?sourceIRI aio:systemName ?source.
 FILTER(?metric = "win_rate")
 OPTIONAL { ?claim aio:validTo ?validTo }
}
ORDER BY DESC(?confidence)

fromSystem is a variable, never a source restriction. The union preserves all three competing definitions and CRM’s expired interval.

Inspect a raw claim at query time
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
DEFINE sql:describe-mode "CBD"
DESCRIBE <https://demo.openlinksw.com/ao26/aio/mined_claim/1#this>
FROM <https://demo.openlinksw.com/ao26/aio#>

Raw MinedClaim properties come directly from SQL through the RDF View; no ETL or duplicate instance store.

One metric: live facts and the derived conclusion
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
DEFINE sql:describe-mode "CBD"
DESCRIBE <https://demo.openlinksw.com/ao26/aio/business_metric/1#this>
FROM <https://demo.openlinksw.com/ao26/aio#>
FROM <https://demo.openlinksw.com/ao26/aio-derived#>

Two FROM graphs combine live SQL-backed metric facts with Addendum B’s physically stored conclusion.

Preview the exact triple before materializing
DEFINE sql:select-option "order"
DEFINE input:storage <https://demo.openlinksw.com/ao26/aio/storage>
PREFIX aio: <http://demo.openlinksw.com/schemas/aiontology/>
SELECT ?metric (aio:currentEstimate AS ?relation) ?confidence
FROM <https://demo.openlinksw.com/ao26/aio#>
WHERE {
  SELECT ?metric ?confidence
  WHERE {
    ?claim a aio:MinedClaim; aio:aboutMetric ?metric; aio:confidence ?confidence;
      aio:validFrom ?validFrom.
    ?metric aio:metricName "win_rate".
    OPTIONAL { ?claim aio:validTo ?validTo }
    FILTER(!bound(?validTo))
    FILTER(?validFrom <= "2026-09-08"^^<http://www.w3.org/2001/XMLSchema#date>)
  }
  ORDER BY DESC(?confidence)
  LIMIT 1
}

Same rule body and policy as Addendum B. SELECT exposes subject, predicate and object before any write.

Query editor

▶ Run on demo.openlinksw.com SELECT: text/x-html+tr | DESCRIBE/CONSTRUCT: text/x-html-nice-turtle