@prefix : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#> .
@prefix schema: <http://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix karp: <https://thecuberesearch.com/319-breaking-analysis-alex-karp-frontier-models-and-the-real-fight-for-enterprise-ai/#> .

# =============================================================================
# Ontology — locally minted terms for this rebuttal, distinct owl:Ontology entity
# =============================================================================

:ontology a owl:Ontology ;
    schema:name "Triple-Grain Rebuttal Local Ontology"@en ;
    schema:description "Lightweight ontology for modeling James Stakelum's twelve alleged RDF/OWL triple-grain failures as first-class claim instances, and for pairing each with a working RDF correction pattern (named graphs, PROV-O, RDF-star, OWL2 entailment, SHACL, and Virtuoso/FuXi reasoning) that demonstrates the failure does not hold against the standards actually in production use."@en ;
    schema:identifier <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4> ;
    rdfs:label "Triple-Grain Rebuttal Local Ontology"@en ;
    rdfs:comment "Defines :SGFFailureClaim (the article's twelve alleged failures, its 'named framework') and :RDFCorrectionPattern (this analysis's working counter-demonstration for each), reusing karp:CriticalPerspective from the theCUBE Research Alex Karp companion KG for the critical-response entity type rather than re-minting an equivalent local class."@en .

:SGFFailureClaim a rdfs:Class ;
    rdfs:label "SGF Failure Claim"@en ;
    rdfs:comment "One of the twelve architectural failures the article alleges against the RDF/OWL triple as the base unit of machine-to-machine meaning transport."@en ;
    rdfs:isDefinedBy :ontology .

:allegedDeficiency a rdf:Property ;
    rdfs:label "alleged deficiency"@en ;
    rdfs:comment "The specific capability the article claims a bare (subject, predicate, object) triple structurally cannot provide, stated in the article's own terms."@en ;
    rdfs:domain :SGFFailureClaim ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy :ontology .

:SowaObjectionClaim a rdfs:Class ;
    rdfs:label "Sowa Objection Claim"@en ;
    rdfs:comment "A distinct claim from John F. Sowa's ontolog-forum post arguing triple stores and OWL are obsolete and unsuitable for new systems. Modeled as its own class, not a subclass/instance of :SGFFailureClaim, because it is a separate source (a different author, venue, and argument) responded to by this document, not part of the SGF article itself."@en ;
    rdfs:isDefinedBy :ontology .

:objectionText a rdf:Property ;
    rdfs:label "objection text"@en ;
    rdfs:comment "The verbatim or near-verbatim wording of a :SowaObjectionClaim, quoted from the source post."@en ;
    rdfs:domain :SowaObjectionClaim ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy :ontology .

:RDFCorrectionPattern a rdfs:Class ;
    rdfs:label "RDF Correction Pattern"@en ;
    rdfs:comment "A working RDF/SPARQL/reasoning demonstration that the paired :SGFFailureClaim is not a structural limitation of the triple, but a modeling or tooling choice already solved in deployed RDF stacks (named graphs, RDF-star/RDF 1.2, PROV-O, OWL2 entailment, SHACL, Virtuoso quad storage, FuXi N3 rules)."@en ;
    rdfs:isDefinedBy :ontology .

:correctedTurtle a rdf:Property ;
    rdfs:label "corrected Turtle"@en ;
    rdfs:comment "A literal Turtle/TriG snippet demonstrating the correction (illustrative, not the full document graph)."@en ;
    rdfs:domain :RDFCorrectionPattern ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy :ontology .

:correctedSparql a rdf:Property ;
    rdfs:label "corrected SPARQL"@en ;
    rdfs:comment "A literal SPARQL query, CONSTRUCT rule, or N3 rule demonstrating retrieval, entailment, or reasoning over the corrected pattern."@en ;
    rdfs:domain :RDFCorrectionPattern ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy :ontology .

:reasoningEngine a rdf:Property ;
    rdfs:label "reasoning engine"@en ;
    rdfs:comment "The specific inference/reasoning mechanism (Virtuoso RDFS++/OWL2-QL entailment, Virtuoso named-graph quad scoping, Virtuoso SHACL validation, or FuXi N3 forward-chaining) that makes the correction operational rather than merely notational."@en ;
    rdfs:domain :RDFCorrectionPattern ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy :ontology .

:namedGraphExample a rdf:Property ;
    rdfs:label "named graph example"@en ;
    rdfs:comment "The illustrative named-graph IRI used to carry provenance, epistemic tier, or source separation in the correction."@en ;
    rdfs:domain :RDFCorrectionPattern ;
    rdfs:range xsd:anyURI ;
    rdfs:isDefinedBy :ontology .

# =============================================================================
# Skill provenance entities
# =============================================================================

<https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator#this> a schema:SoftwareApplication ;
    schema:name "kg-generator skill"@en ;
    schema:url <https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator> ;
    schema:description "Skill that generates comprehensive RDF-Turtle or JSON-LD knowledge graphs from web and document sources, including thesis/framework rebuttals with agent-authored critical-perspective sections."@en .

<https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/rdf-infographic-skill#this> a schema:SoftwareApplication ;
    schema:name "rdf-infographic-skill"@en ;
    schema:url <https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/rdf-infographic-skill> ;
    schema:description "Skill that generates interactive HTML infographics and Markdown companions from RDF knowledge graphs."@en .

# =============================================================================
# Main analysis + source article + author
# =============================================================================

:analysis a schema:CreativeWork, schema:Article ;
    schema:name "Rebuttal: Why 'The Triple Is the Wrong Grain' Is Wrong About the Triple"@en ;
    schema:headline "Why the Triple Is the Wrong Grain — An RDF Rebuttal"@en ;
    schema:description "A structured rebuttal of James Stakelum's Medium article proposing the Symbol Grounding Framework (SGF) and its 'Synapse' unit as a replacement for the RDF triple. For each of the twelve alleged failures, this analysis reproduces the article's own worked example and demonstrates a working RDF correction using named graphs, RDF-star/RDF 1.2 quoted triples, PROV-O provenance, OWL2 entailment, SHACL validation, and Virtuoso/FuXi reasoning — arguing the failures are modeling-discipline gaps in the article's illustrative triples, not structural limits of the triple as a data model."@en ;
    schema:abstract """<p class="lede">James Stakelum's &quot;Why the Triple Is the Wrong Grain&quot; argues the RDF/OWL triple is architecturally unfit for machine-to-machine AI communication — this page answers that claim failure by failure, with working RDF, not just counter-argument.</p>
<p>The article catalogues <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23failuresSection" target="_blank" rel="noopener noreferrer">twelve failures</a> across event structure, provenance, epistemic status, grounding, relational modeling, and cross-system exchange, then proposes the <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23sgfFramework" target="_blank" rel="noopener noreferrer">Symbol Grounding Framework (SGF)</a> and its &quot;<a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23termSgfSynapse" target="_blank" rel="noopener noreferrer">Synapse</a>&quot; hub-and-spoke claim structure as a replacement grain.</p>
<p>Each failure is met with a standards-based RDF correction already in production use: n-ary event modeling, <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23termNamedGraph" target="_blank" rel="noopener noreferrer">named-graph</a> provenance, <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23termProvO" target="_blank" rel="noopener noreferrer">PROV-O</a> attribution, <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23termRdfStar" target="_blank" rel="noopener noreferrer">RDF-star</a> (RDF 1.2) quoted triples for saying-versus-said, <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23termShacl" target="_blank" rel="noopener noreferrer">SHACL</a>-enforced purpose properties, and deterministic <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23termOwl2Entailment" target="_blank" rel="noopener noreferrer">OWL2 entailment</a> — via <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23termVirtuosoQuadStore" target="_blank" rel="noopener noreferrer">Virtuoso</a>'s built-in reasoner or a <a href="https://linkeddata.uriburner.com/describe/?url=https%3A%2F%2Fmedium.com%2F%40JamesStakelum%2Fwhy-the-triple-is-the-wrong-grain-1cad99e136f4%23termFuxi" target="_blank" rel="noopener noreferrer">FuXi</a> N3 rule — in place of embedding-similarity alignment.</p>
<p>The recurring pattern: every failure traces to an under-specified illustrative triple in the article, not a structural ceiling on the triple as a data model — the capabilities SGF proposes as new primitives already have named, standardized RDF equivalents. A second, independent objection from John F. Sowa gets the same treatment below. See <a href="#rebuttal">Rebuttal</a> for the full failure-by-failure breakdown with corrected Turtle and SPARQL for each, and <a href="#sowa-objections">Also Answering</a> for Sowa's four claims.</p>"""@en ;
    schema:about :sourceArticle ;
    schema:dateCreated "2026-08-12"^^xsd:date ;
    schema:hasPart :failuresSection, :correctionsSection, :sowaSection, :demoDataSection, :faqSection, :glossarySection, :howtoSection ;
    prov:wasGeneratedBy <https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator#this> .

:sourceArticle a schema:CreativeWork ;
    schema:name "Why the Triple Is the Wrong Grain"@en ;
    schema:url <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4> ;
    schema:author <https://medium.com/@JamesStakelum#this> ;
    schema:datePublished "2026"^^xsd:gYear ;
    schema:description "Medium article arguing the RDF/OWL triple is architecturally inadequate for machine-to-machine AI communication, identifying twelve failures and proposing the Symbol Grounding Framework (SGF) with its 'Synapse' hub-and-spoke claim structure as a replacement."@en ;
    schema:publisher <http://dbpedia.org/resource/Medium_(website)> .

<https://medium.com/@JamesStakelum#this> a schema:Person ;
    schema:name "James Stakelum"@en ;
    schema:url <https://medium.com/@JamesStakelum> .

# =============================================================================
# SGF's own proposed vocabulary (modeled faithfully — not part of the rebuttal)
# =============================================================================

:sgfFramework a schema:CreativeWork ;
    schema:name "Symbol Grounding Framework (SGF) / Synapse"@en ;
    schema:description "The article's proposed replacement for the triple: a hub-and-spoke 'Synapse' claim structure with a central VerbHub, 15 fixed semantic roles, a Derivation Tag for architectural provenance, and a 7-tier epistemic hierarchy, governed by a closed grammar (15 roles, 8 link types, 1 generic verb, 4 identity relations) plus an open vocabulary of concepts."@en ;
    schema:isPartOf :sourceArticle .

:sgfVerbHub a skos:Concept ;
    skos:prefLabel "VerbHub"@en ;
    skos:definition "The central node of a Synapse claim, holding the action/relation that fixed semantic-role spokes (HAS_AGENT, HAS_PATIENT, HAS_LOCATION, HAS_TIME, etc.) attach to."@en ;
    skos:inScheme :sgfFramework .

:sgfEpistemicHierarchy a skos:Concept ;
    skos:prefLabel "SGF Epistemic Hierarchy"@en ;
    skos:definition "Seven epistemic tiers the article assigns to every claim: CORE_DEFINITION, CONSTITUTIVE, SOURCED, CLAIMED, INFERRED, PROVISIONAL, GHOST."@en ;
    skos:inScheme :sgfFramework .

# =============================================================================
# The twelve failure claims (schema:position-ordered instances of :SGFFailureClaim)
# =============================================================================

:failuresSection a schema:CreativeWork ;
    schema:isPartOf :analysis ;
    schema:name "The Article's Twelve Alleged Failures"@en ;
    schema:description "The article's own worked examples for each of its twelve claimed triple-grain failures, reproduced verbatim/near-verbatim for accurate critique."@en ;
    schema:hasPart :f1, :f2, :f3, :f4, :f5, :f6, :f7, :f8, :f9, :f10, :f11, :f12 .

:f1 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 1 ;
    schema:name "Triples shatter events"@en ;
    :allegedDeficiency "The verb becomes merely an edge label without structural boundaries; an event decomposed into separate (subject, predicate, object) triples loses its identity as a single whole."@en ;
    schema:workExample :q1Example .

:q1Example a schema:Quotation ;
    schema:text "Beethoven composed the Ninth Symphony in Vienna in 1824"@en ;
    schema:citation :sourceArticle .

:f2 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 2 ;
    schema:name "Provenance is optional, not architectural"@en ;
    :allegedDeficiency "The identical triple `:Beethoven :composed :NinthSymphony` carries no structural requirement to record whether it came from a scholarly biography or a random comment; named graphs are an optional bolt-on that can be stripped."@en ;
    schema:workExample :q2Example .

:q2Example a schema:Quotation ;
    schema:text ":Beethoven :composed :NinthSymphony — identical whether sourced from a scholarly biography or a random comment"@en ;
    schema:citation :sourceArticle .

:f3 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 3 ;
    schema:name "Epistemic status cannot be distinguished"@en ;
    :allegedDeficiency "Fact, inference, and guess are indistinguishable at the triple level: a documented fact and an inference from indirect evidence produce identical triples."@en ;
    schema:workExample :q3Example .

:q3Example a schema:Quotation ;
    schema:text "Beethoven was born in Bonn (documented fact) versus Beethoven was born in 1770 (inferred from baptismal records) — identical triples despite different epistemic grounding"@en ;
    schema:citation :sourceArticle .

:f4 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 4 ;
    schema:name "URIs lack native disambiguation"@en ;
    :allegedDeficiency "A URI like `:Beethoven` cannot disambiguate composer from dog from crater without reliance on an external ontology, causing dangling references."@en ;
    schema:workExample :q4Example .

:q4Example a schema:Quotation ;
    schema:text "The URI :Beethoven cannot disambiguate composer from dog from crater without external ontology"@en ;
    schema:citation :sourceArticle .

:f5 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 5 ;
    schema:name "TBox event definitions cannot capture purpose"@en ;
    :allegedDeficiency "A class definition built from structural parts (e.g. blade + handle) cannot capture the function or purpose the object serves."@en ;
    schema:workExample :q5Example .

:q5Example a schema:Quotation ;
    schema:text "\"Scalpel\" defined as cutting_tool with blade and handle lacks the purpose: cut living tissue with precision"@en ;
    schema:citation :sourceArticle .

:f6 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 6 ;
    schema:name "Cannot distinguish saying from said-to-be-true"@en ;
    :allegedDeficiency "A triple recording an utterance is indistinguishable from a triple asserting the utterance's content is true."@en ;
    schema:workExample :q6Example .

:q6Example a schema:Quotation ;
    schema:text "The defendant said \"I am innocent\" — the system cannot distinguish belief in innocence from recording the utterance"@en ;
    schema:citation :sourceArticle .

:f7 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 7 ;
    schema:name "Conflicting claims average into hallucinated middle ground"@en ;
    :allegedDeficiency "When two sources disagree, naive merging produces a synthesized truth that neither source actually supports."@en ;
    schema:workExample :q7Example .

:q7Example a schema:Quotation ;
    schema:text "Source A claims Bonn as birthplace; Source B claims Koblenz — the \"average\" would create a hallucinated third location neither supports"@en ;
    schema:citation :sourceArticle .

:f8 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 8 ;
    schema:name "Chronological order and narrative order collapse into one"@en ;
    :allegedDeficiency "A triple store cannot represent that events are recounted in an order different from the order they actually occurred."@en ;
    schema:workExample :q8Example .

:q8Example a schema:Quotation ;
    schema:text "The king died. He had eaten poison the night before — poison chronologically precedes death but narrative presents death first"@en ;
    schema:citation :sourceArticle .

:f9 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 9 ;
    schema:name "Every relational noun requires a new predicate"@en ;
    :allegedDeficiency "Citizenship, employment, ownership, and every other relational noun each demand a bespoke predicate, causing unbounded predicate proliferation."@en ;
    schema:workExample :q9Example .

:q9Example a schema:Quotation ;
    schema:text "Alice has citizenship in France — citizenship, employment, ownership each require new predicates in RDF/OWL"@en ;
    schema:citation :sourceArticle .

:f10 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 10 ;
    schema:name "No communicative intent"@en ;
    :allegedDeficiency "A triple cannot declare whether it is being asserted as INFORM, posed as QUERY, or issued as COMMAND."@en ;
    schema:workExample :q10Example .

:q10Example a schema:Quotation ;
    schema:text "\"Beethoven composed the Ninth\" cannot declare whether this is INFORM, QUERY, or COMMAND"@en ;
    schema:citation :sourceArticle .

:f11 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 11 ;
    schema:name "Claims lack an admission context for cross-system exchange"@en ;
    :allegedDeficiency "A triple, when exchanged between systems, carries no envelope of identity, provenance, lexical material, and integrity checks."@en ;
    schema:workExample :q11Example .

:q11Example a schema:Quotation ;
    schema:text "Claims lack envelope with identity, provenance, lexical material, and integrity checks for system-to-system exchange"@en ;
    schema:citation :sourceArticle .

:f12 a :SGFFailureClaim ; schema:isPartOf :failuresSection ;
    schema:position 12 ;
    schema:name "Alignment is probabilistic, not deterministic"@en ;
    :allegedDeficiency "Reconciling `:Composer` and `:MusicalCreator` in RDF/OWL relies on probabilistic embedding similarity rather than verifiable, deterministic proof."@en ;
    schema:workExample :q12Example .

:q12Example a schema:Quotation ;
    schema:text ":Composer versus :MusicalCreator — RDF/OWL uses probabilistic similarity scores rather than verifiable proof"@en ;
    schema:citation :sourceArticle .

# =============================================================================
# The twelve corrections (karp:CriticalPerspective reused + :RDFCorrectionPattern local)
# =============================================================================

:correctionsSection a schema:CreativeWork ;
    schema:isPartOf :analysis ;
    schema:name "RDF Corrections to the Article's Twelve Examples"@en ;
    schema:description "For each alleged failure, a working RDF/SPARQL correction using named graphs, RDF-star/RDF 1.2, PROV-O, OWL2 entailment, SHACL, and Virtuoso/FuXi reasoning, demonstrating the failure is a gap in the article's illustrative triples rather than a structural limit of the triple as a data model."@en ;
    schema:author <https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator#this> ;
    schema:accountablePerson <https://www.linkedin.com/in/kidehen#this> ;
    prov:wasGeneratedBy <https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator#this> ;
    schema:hasPart :c1, :c2, :c3, :c4, :c5, :c6, :c7, :c8, :c9, :c10, :c11, :c12 .

:c1 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f1 ;
    schema:position 1 ;
    schema:name "Events are n-ary relations, not shattered triples"@en ;
    schema:description "The event is not the triple — it is a first-class resource that a set of triples describe, exactly as PROV-O and schema.org model events today. Retrieval targets the event IRI or its named graph, not any single edge, so nothing is 'shattered'; the verb is not an edge label, it is the rdf:type of the event resource."@en ;
    :correctedTurtle """GRAPH <urn:g:beethoven-1824-composition> {
  :beethovenNinthComposition a schema:CreateAction ;
      schema:agent :Beethoven ;
      schema:result :NinthSymphony ;
      schema:location :Vienna ;
      schema:startTime "1824"^^xsd:gYear .
}"""^^xsd:string ;
    :correctedSparql """CONSTRUCT { ?event ?p ?o }
FROM NAMED <urn:g:beethoven-1824-composition>
WHERE { GRAPH <urn:g:beethoven-1824-composition> { ?event ?p ?o } }"""^^xsd:string ;
    :reasoningEngine "Virtuoso quad-scoped GRAPH retrieval: the event IRI, not the individual triple, is the unit of retrieval and identity, so the whole event round-trips atomically from a single CONSTRUCT."@en ;
    :namedGraphExample <urn:g:beethoven-1824-composition> .

:c2 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f2 ;
    schema:position 2 ;
    schema:name "Provenance is structurally mandatory in a quad store, not optional"@en ;
    schema:description "In any RDF quad store (Virtuoso included), every triple is physically stored as (subject, predicate, object, graph) — the graph column is not optional metadata, it is the storage unit. PROV-O then gives that graph IRI a typed, queryable attribution chain."@en ;
    :correctedTurtle """GRAPH <urn:g:src-scholarly-biography> {
  :Beethoven :composed :NinthSymphony .
}
<urn:g:src-scholarly-biography> a prov:Entity ;
    prov:wasAttributedTo :scholarlyBiographySource ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX prov: <http://www.w3.org/ns/prov#>
SELECT DISTINCT ?g ?attribution
FROM NAMED <urn:g:src-scholarly-biography>
WHERE {
  GRAPH ?g { :Beethoven :composed :NinthSymphony }
  ?g prov:wasAttributedTo ?attribution
}"""^^xsd:string ;
    :reasoningEngine "Virtuoso stores every triple as a quad; provenance is not an RDF-model add-on but the fourth, structurally mandatory column that PROV-O annotates."@en ;
    :namedGraphExample <urn:g:src-scholarly-biography> .

:c3 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f3 ;
    schema:position 3 ;
    schema:name "Epistemic status is a graph-level annotation, materialized per-triple by an N3/FuXi rule"@en ;
    schema:description "Fact, inference, and guess are separated by placing each claim in an epistemic-tier named graph, then using a forward-chaining rule to propagate the tier onto every triple in that graph — exactly the kind of finite, deterministic derivation the article demands, running on RDF's own reasoning stack."@en ;
    :correctedTurtle """GRAPH <urn:g:epistemic:documented-fact> { :Beethoven :birthPlace :Bonn }
GRAPH <urn:g:epistemic:inferred> { :Beethoven :birthYear "1770"^^xsd:gYear }
<urn:g:epistemic:inferred> a :InferredClaimGraph ."""^^xsd:string ;
    :correctedSparql """# N3 rule (not SPARQL) — for FuXi or another N3-aware forward-chaining reasoner
@prefix : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#> .
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
{ ?g a :InferredClaimGraph . ?g log:semantics ?f . ?f log:includes { ?s ?p ?o } } => { ?s :epistemicStatus :Inferred } ."""^^xsd:string ;
    :reasoningEngine "FuXi N3 forward-chaining rule promotes the graph-level epistemic tier to a per-triple :epistemicStatus annotation; the equivalent materialization also runs as a plain SPARQL INSERT ... WHERE over named graphs in Virtuoso."@en ;
    :namedGraphExample <urn:g:epistemic:inferred> .

:c4 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f4 ;
    schema:position 4 ;
    schema:name "Disambiguation is deterministic dereference plus OWL2 identity closure, not a missing feature"@en ;
    schema:description "A document-local URI is exactly analogous to SGF's own 'Canonical ID with finite IS-A path to a Prime Registry' — it is deliberately under-specified until linked. owl:sameAs to a DBpedia/Wikidata IRI supplies the disambiguating IS-A path, and OWL2 reasoners close that identity transitively and deterministically."@en ;
    :correctedTurtle ":Beethoven owl:sameAs <http://dbpedia.org/resource/Ludwig_van_Beethoven> ."^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>

# (1) Baseline — no reasoning. Empirically verified against the live demo
#     dataset: returns false, because :Beethoven carries no direct rdf:type
#     triple to dbo:Person, only owl:sameAs to the DBpedia resource.
ASK { :Beethoven a <http://dbpedia.org/ontology/Person> }

# (2) Same ASK with Virtuoso's same-as reasoning pragma enabled — no named
#     ruleset needed, just the pragma. Empirically verified: returns true.
#     Deliberately has NO FROM/GRAPH restriction: the entailment bridges our
#     locally-asserted owl:sameAs triple with DBpedia's OWN rdf:type
#     assertion, which lives in a different graph elsewhere in the store —
#     scoping to our own graph would exclude that assertion and defeat the
#     demonstration.
DEFINE input:same-as "yes"
PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
ASK { :Beethoven a <http://dbpedia.org/ontology/Person> }

# (3) Equivalent entailment as a portable FuXi N3 rule (works on any N3-aware
#     reasoner, not just Virtuoso's pragma):
@prefix : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
{ ?x owl:sameAs ?y . ?y a ?C } => { ?x a ?C } .
{ ?x owl:sameAs ?y . ?x a ?C } => { ?y a ?C } ."""^^xsd:string ;
    :reasoningEngine "Virtuoso's input:same-as query pragma (no named ruleset required) closes owl:sameAs transitively across the identity graph on demand: without it the ASK is false (no direct rdf:type assertion), with it the identical ASK is true (propagated via the owl:sameAs link to DBpedia's own rdf:type assertion) — empirically verified against the live demo dataset both ways. A FuXi N3 rule computes the identical entailment without any Virtuoso-specific pragma, for portability to any N3-aware reasoner."@en ;
    :namedGraphExample <urn:g:identity:beethoven> .

:c5 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f5 ;
    schema:position 5 ;
    schema:name "Purpose is a required SHACL-enforced property, not an absent capability"@en ;
    schema:description "RDFS/OWL classes are not limited to structural parts; a purpose/function datatype property is ordinary RDF. What the article's example actually shows is an under-specified class definition, correctable with a SHACL shape that makes the purpose triple mandatory for every instance of the class."@en ;
    :correctedTurtle """:Scalpel a :SurgicalTool ;
    schema:description "Cutting tool for making precise incisions in living tissue."@en ;
    :hasPurpose "cut living tissue with precision"@en .
:SurgicalToolShape a sh:NodeShape ;
    sh:targetClass :SurgicalTool ;
    sh:property [ sh:path :hasPurpose ; sh:minCount 1 ] ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?tool WHERE { ?tool a :SurgicalTool . FILTER NOT EXISTS { ?tool :hasPurpose ?p } }"""^^xsd:string ;
    :reasoningEngine "Virtuoso SHACL validation rejects any :SurgicalTool instance lacking a :hasPurpose triple, enforcing function-capture at write time rather than leaving it optional."@en ;
    :namedGraphExample <urn:g:tbox:surgical-tools> .

:c6 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f6 ;
    schema:position 6 ;
    schema:name "RDF-star / RDF 1.2 quoted triples make the statement itself the subject of belief"@en ;
    schema:description "RDF 1.2's quoted-triple syntax lets an entire triple be the subject of a further triple, so 'the defendant said X' and 'X is true' are structurally distinct statements about a statement — exactly the saying-versus-said distinction the article claims is impossible."@en ;
    :correctedTurtle """<<:defendant :claims "I am innocent"@en>> :speechAct :INFORM ; :assertedBy :courtTranscript .

:defendantInnocenceUtterance a rdf:Statement ;
    rdf:subject :defendant ; rdf:predicate :claims ; rdf:object "I am innocent"@en ;
    :speechAct :INFORM ; :assertedBy :courtTranscript ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?claim ?speechAct WHERE {
  ?claim a rdf:Statement ;
      rdf:subject :defendant ; rdf:predicate :claims ; rdf:object "I am innocent"@en ;
      :speechAct ?speechAct .
}"""^^xsd:string ;
    :reasoningEngine "Classic rdf:Statement reification stores the utterance as an addressable node, so belief-about-the-utterance and the utterance itself are two different, independently queryable resources — the same distinction RDF-star's <<...>> syntax expresses more compactly, and already does on Virtuoso Open Source Edition. Verified live (2026-08-13) against this document's own demo dataset using reification, since the commercial edition behind the live URIBurner endpoint this document links to will support these RDF release enhancements in an upcoming release."@en ;
    :namedGraphExample <urn:g:testimony:defendant-statement> .

:c7 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f7 ;
    schema:position 7 ;
    schema:name "SPARQL never averages conflicting claims — retrieval is graph-scoped, not blended"@en ;
    schema:description "No conformant SPARQL engine merges Bonn and Koblenz into a hallucinated third city; each claim lives in its own source-attributed named graph, and a GRAPH-scoped SELECT returns both claims labeled by source. Reconciliation, if desired, is an explicit, auditable CONSTRUCT rule chosen by the application — never an implicit average."@en ;
    :correctedTurtle """GRAPH <urn:g:sourceA> { :Beethoven :birthPlace :Bonn }
GRAPH <urn:g:sourceB> { :Beethoven :birthPlace :Koblenz }"""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?g ?place
FROM NAMED <urn:g:sourceA>
FROM NAMED <urn:g:sourceB>
WHERE { GRAPH ?g { :Beethoven :birthPlace ?place } }"""^^xsd:string ;
    :reasoningEngine "Virtuoso's GRAPH-scoped SPARQL SELECT returns each conflicting claim tagged with its source graph; no averaging step exists anywhere in the SPARQL 1.1 algebra."@en ;
    :namedGraphExample <urn:g:sourceA> .

:c8 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f8 ;
    schema:position 8 ;
    schema:name "RDF triples are an unordered set — narrative order was never encoded, so it cannot collapse with chronology"@en ;
    schema:description "The premise misdiagnoses the model: RDF makes no claim about document/narrative order at all, so there is no narrative-vs-chronology collapse to fix. Chronology is asserted explicitly via xsd:dateTime literals and an explicit :precedes/prov:startedAtTime ordering, entirely independent of how or in what order the triples are written or read."@en ;
    :correctedTurtle """:precedes a owl:TransitiveProperty .
:poisoning a schema:Event ; prov:endedAtTime "1815-06-14T20:00:00"^^xsd:dateTime ; :precedes :death .
:death a schema:Event ; prov:startedAtTime "1815-06-15T06:00:00"^^xsd:dateTime ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?e1 ?e2 WHERE { ?e1 :precedes ?e2 } ORDER BY ?e1"""^^xsd:string ;
    :reasoningEngine "The TBox declares :precedes a owl:TransitiveProperty; Virtuoso's OWL2-RL entailment then derives any multi-hop :precedes chain (e.g. A precedes B precedes C entails A precedes C) automatically, giving deterministic chronological ordering entirely independent of triple/document order — without the declaration, only the directly asserted pairs would be visible to a query, not their transitive closure."@en ;
    :namedGraphExample <urn:g:events:king-poisoning> .

:c9 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f9 ;
    schema:position 9 ;
    schema:name "Bounded-grammar reasoning over an open predicate vocabulary is a feature RDF already has via rdfs:subPropertyOf"@en ;
    schema:description "SGF itself concedes it needs 'an open vocabulary' alongside its closed 15-role grammar for exactly this reason. RDFS already supplies that split: new relational predicates (citizenship, employment, ownership) are declared as rdfs:subPropertyOf a small set of superproperties, so reasoning stays bounded to the superproperty set while the predicate vocabulary itself remains open and infinitely extensible — the identical tradeoff SGF claims as its own advantage."@en ;
    :correctedTurtle """:hasCitizenship rdfs:subPropertyOf :hasRelationalStatus .
:Alice :hasCitizenship :France ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
# Requires RDFS subproperty entailment (rdfs:subPropertyOf) enabled on the
# endpoint — no triple asserts :hasRelationalStatus directly; it is entailed
# from :hasCitizenship. Without a reasoner, query :hasCitizenship directly.
SELECT DISTINCT ?s ?o WHERE { ?s :hasRelationalStatus ?o }"""^^xsd:string ;
    :reasoningEngine "Virtuoso RDFS++ entailment on rdfs:subPropertyOf makes every new relational predicate automatically visible under its bounded superproperty, without touching the reasoning grammar."@en ;
    :namedGraphExample <urn:g:relations:citizenship> .

:c10 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f10 ;
    schema:position 10 ;
    schema:name "Speech-act typing attaches to the triple (RDF-star) or its graph — a controlled vocabulary, not a new grain"@en ;
    schema:description "A closed 13-term act-type vocabulary (INFORM, QUERY, COMMAND, ...) is a SKOS concept scheme like any other. RDF-star lets it annotate the quoted triple directly; where RDF-star is unavailable, the same annotation attaches to the statement's named graph. Nothing about (subject, predicate, object) prevents adding a speech-act annotation — it is absent from the article's examples, not absent from RDF."@en ;
    :correctedTurtle """<<:Beethoven :composed :NinthSymphony>> :speechAct :INFORM .

:beethovenCompositionUtterance a rdf:Statement ;
    rdf:subject :Beethoven ; rdf:predicate :composed ; rdf:object :NinthSymphony ;
    :speechAct :INFORM ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?stmt ?act WHERE {
  ?stmt a rdf:Statement ; rdf:subject :Beethoven ; rdf:predicate :composed ; rdf:object :NinthSymphony ; :speechAct ?act .
}"""^^xsd:string ;
    :reasoningEngine "Classic rdf:Statement reification plus a SKOS-typed :speechAct concept scheme gives every claim a queryable, closed-vocabulary communicative-intent annotation — RDF-star's <<...>> syntax expresses the same thing more compactly, and already does on Virtuoso Open Source Edition. Verified live (2026-08-13) against this document's own demo dataset using reification, since the commercial edition behind the live URIBurner endpoint this document links to will support these RDF release enhancements in an upcoming release."@en ;
    :namedGraphExample <urn:g:speechacts:beethoven-claim> .

:c11 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f11 ;
    schema:position 11 ;
    schema:name "A signed named graph, serialized as TriG, IS the admission envelope"@en ;
    schema:description "SGF's four required envelope fields — identity, provenance, lexical material, and integrity — map directly onto existing RDF/PROV-O primitives: the graph IRI is the identity, prov:wasAttributedTo/prov:generatedAtTime is the provenance, the triples inside the graph are the lexical material, and a content-hash literal (or a detached signature over the canonicalized TriG serialization) is the integrity check. This is a packaging convention, already standard in Linked Data publishing, not a missing primitive."@en ;
    :correctedTurtle """<urn:g:claim42> a prov:Entity ;
    prov:wasAttributedTo :sourceX ;
    prov:generatedAtTime "2026-08-12T00:00:00Z"^^xsd:dateTime ;
    :contentHash "sha256:9f3a...c21"^^xsd:string ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX prov: <http://www.w3.org/ns/prov#>
SELECT DISTINCT ?g ?attributedTo ?hash WHERE { ?g a prov:Entity ; prov:wasAttributedTo ?attributedTo ; :contentHash ?hash }"""^^xsd:string ;
    :reasoningEngine "A signed TriG document (named graph + PROV-O metadata + content hash) is the RDF-native admission envelope; Virtuoso ingests and validates it as a single quad-store transaction, and FuXi rules can further check hash/signature consistency before admitting the graph."@en ;
    :namedGraphExample <urn:g:claim42> .

:c12 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :correctionsSection ;
    karp:respondsTo :f12 ;
    schema:position 12 ;
    schema:name "OWL2 equivalence entailment is deterministic and provable, not probabilistic similarity"@en ;
    schema:description "Reconciling :Composer and :MusicalCreator has had a deterministic, formally specified mechanism since OWL2 in 2004: owl:equivalentClass, computed by a description-logic reasoner. This is the precise opposite of an embedding-similarity score — it is provable entailment under a fixed model-theoretic semantics, the same standard of determinism SGF's own 'deterministic verification' criterion demands."@en ;
    :correctedTurtle """:Composer owl:equivalentClass :MusicalCreator .
:Beethoven a :Composer ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>

# Unlike owl:sameAs (see :c4), owl:equivalentClass entailment on Virtuoso is
# NOT reachable via a simple query-level DEFINE pragma — empirically verified
# against the live demo dataset: this ASK returns false both without AND
# with `DEFINE input:same-as "yes"` (that pragma is specific to owl:sameAs).
# Exercising it requires a server-side registered RDFS/OWL ruleset via
# Virtuoso's rdfs_rule_set() stored procedure (admin/SQL operation, not
# achievable from a plain SPARQL HTTP query), so this document does not claim
# a working Virtuoso pragma for this specific entailment.
ASK { :Beethoven a :MusicalCreator }

# The portable, verifiable mechanism for this entailment is the FuXi N3 rule
# below, which requires no server-side configuration:
@prefix : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
{ ?C1 owl:equivalentClass ?C2 . ?x a ?C1 } => { ?x a ?C2 } .
{ ?C1 owl:equivalentClass ?C2 . ?x a ?C2 } => { ?x a ?C1 } ."""^^xsd:string ;
    :reasoningEngine "owl:equivalentClass entailment is deterministic and provable under OWL2's formal semantics — computed by a description-logic reasoner (an external DL reasoner such as HermiT/Pellet via the OWL API, a Virtuoso-registered rdfs_rule_set() ruleset, or a FuXi N3 rule) rather than probabilistic similarity. This is a different Virtuoso mechanism from the input:same-as query pragma used for :c4's owl:sameAs entailment — no simple query-level pragma exists for owl:equivalentClass."@en ;
    :namedGraphExample <urn:g:alignment:composer-musicalcreator> .

# =============================================================================
# A second, independent critic: John F. Sowa's ontolog-forum objections
# =============================================================================

:johnSowa a schema:Person ;
    schema:name "John F. Sowa"@en ;
    owl:sameAs <http://dbpedia.org/resource/John_F._Sowa> .

:sowaPost a schema:DiscussionForumPosting ;
    schema:name "Ontology Summit talk by Majumdar and Sowa"@en ;
    schema:url <https://groups.google.com/g/ontolog-forum/c/VimON_gBBjk/m/CvDZHA6pCgAJ> ;
    schema:author :johnSowa ;
    schema:datePublished "2026-08-11"^^xsd:date ;
    schema:description "An ontolog-forum post in which Sowa shares James Stakelum's independent, favorable review of a 2026 Ontology Summit talk he gave with Arun Majumdar, and states his own view that triple stores and OWL are obsolete for new systems — a second, independently-sourced objection to the RDF triple, argued on efficiency/architecture grounds rather than the SGF article's modeling-expressiveness grounds."@en .

:sowaSection a schema:CreativeWork ; schema:isPartOf :analysis ;
    schema:name "Responding to John F. Sowa's Ontolog-Forum Objections to Triple Stores"@en ;
    schema:description "John F. Sowa (co-creator of Conceptual Graphs, ISO Common Logic) posted a separate, independent objection to triple stores in the same week as this rebuttal — not part of the SGF article, but the same underlying claim (the triple is the wrong grain) from a different, prominent source and a different angle: obsolescence and computational efficiency rather than modeling expressiveness. Each of his claims is quoted and answered below using the same working-RDF evidence (named graphs, PROV-O, OWL2/FuXi entailment, and the live SPARQL demonstrations) as the twelve SGF corrections above."@en ;
    schema:about :sowaPost ;
    schema:hasPart :s1, :sc1, :s2, :sc2, :s3, :sc3, :s4, :sc4 .

:s1 a :SowaObjectionClaim ; schema:isPartOf :sowaSection ;
    schema:position 1 ;
    schema:name "Triple stores are obsolete"@en ;
    :objectionText "Every triple store deployment, regardless of scale or workload, is dismissed with a single unqualified adjective — no benchmark, no comparison criteria, and no acknowledgment of RDF's ongoing W3C standardization work are offered as support."@en ;
    schema:workExample :q13Sowa .

:q13Sowa a schema:Quotation ;
    schema:text "The triple store representation used by OWL and related software is obsolete."@en ;
    schema:citation :sowaPost .

:sc1 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :sowaSection ;
    karp:respondsTo :s1 ;
    schema:position 1 ;
    schema:name "'Obsolete' is asserted, not demonstrated — RDF is under active standardization and running at web scale, including live in this document"@en ;
    schema:description "The claim carries no benchmark, no citation, and no definition of what 'obsolete' would even mean for a data model still receiving active W3C standardization work (RDF 1.2, including RDF-star, SPARQL 1.2) and running production-scale deployments (DBpedia, Wikidata, the EU Publications Office, and many other Virtuoso instances — both internally and across the wider LOD Cloud — run production systems comprising billions of triples, handling unpredictable usage loads at high performance and scale, including federated SPARQL queries across independently-operated endpoints). This document's own :demoQ9 is a small, concrete counter-demonstration: a single owl:sameAs triple, on a live Virtuoso endpoint, transitively pulls in 71 independently-published DBpedia types for one entity — federation across organizational boundaries that a from-scratch, non-RDF representation would have to rebuild from zero. Asserting obsolescence without engaging any of this evidence is not itself evidence."@en ;
    :correctedTurtle ":Beethoven owl:sameAs <http://dbpedia.org/resource/Ludwig_van_Beethoven> ."^^xsd:string ;
    :correctedSparql """DEFINE input:same-as "yes"
PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?type WHERE { :Beethoven a ?type }"""^^xsd:string ;
    :reasoningEngine "Same mechanism as :c4/:demoQ9 — verified live: 71 independently-published DBpedia types entailed through one locally-asserted owl:sameAs triple, evidence of an actively-used, actively-federating data model, not an obsolete one."@en ;
    :namedGraphExample <urn:g:identity:beethoven> .

:s2 a :SowaObjectionClaim ; schema:isPartOf :sowaSection ;
    schema:position 2 ;
    schema:name "A blanket 'never' for new systems"@en ;
    :objectionText "A prohibition covering every new system unconditionally, with no carve-out for systems that specifically need to interoperate with the existing Web of Linked Data — the one workload where RDF's schema-free mergeability across independently-designed graphs is the entire point, not an afterthought."@en ;
    schema:workExample :q14Sowa .

:q14Sowa a schema:Quotation ;
    schema:text "OWL and triple stores should never be used for new systems."@en ;
    schema:citation :sowaPost .

:sc2 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :sowaSection ;
    karp:respondsTo :s2 ;
    schema:position 2 ;
    schema:name "A sweeping 'never' ignores RDF's specific comparative advantage: interoperability across organizations that never coordinated with each other"@en ;
    schema:description "RDF's value for a NEW system is not nostalgia for legacy data — it is that any two independently-designed RDF graphs can be unioned without schema negotiation, because every term is a globally-dereferenceable IRI rather than a locally-scoped internal identifier. A new system built on a closed internal representation (conceptual graphs included) gains nothing from that property until it re-implements an equivalent open, IRI-addressed identity and vocabulary-reuse layer — at which point it has re-invented, not avoided, what RDF already provides as a W3C-standardized, multi-vendor-implemented baseline. 'Never' would have to mean 'never build a system that needs to interoperate with the existing Web of Linked Data,' which is a much narrower and more defensible claim than the one actually made."@en ;
    :correctedTurtle """:hasCitizenship rdfs:subPropertyOf :hasRelationalStatus .
:Alice :hasCitizenship :France ."""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?s ?o WHERE { ?s :hasRelationalStatus ?o }"""^^xsd:string ;
    :reasoningEngine "Same mechanism as :c9 — a new system can mint new relational predicates freely (open vocabulary) while an RDFS reasoner keeps them bounded under a small, agreed superproperty set (closed grammar) — the interoperability property a closed internal representation has to build separately, not one triples lack."@en ;
    :namedGraphExample <urn:g:relations:citizenship> .

:s3 a :SowaObjectionClaim ; schema:isPartOf :sowaSection ;
    schema:position 3 ;
    schema:name "Triple stores need disproportionate compute — 'immense numbers of Nvidia chips' — that alternative systems avoid"@en ;
    :objectionText "Majumdar demonstrated rapid response to complex questions on large amounts of data on a laptop, and Permion customers operate significantly larger datasets without requiring immense numbers of Nvidia chips or massive cooling infrastructure."@en ;
    schema:workExample :q15Sowa .

:q15Sowa a schema:Quotation ;
    schema:text "rapid response to complex questions on large amounts of data ... without requiring immense numbers of Nvidia chips"@en ;
    schema:citation :sowaPost .

:sc3 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :sowaSection ;
    karp:respondsTo :s3 ;
    schema:position 3 ;
    schema:name "The GPU framing conflates neural/LLM systems with symbolic triple stores — both conceptual graphs and RDF triple stores are CPU-based symbolic representations, not GPU-dependent ones"@en ;
    schema:description "Production triple stores (Virtuoso among them) are relational/column-store-derived quad engines that run on ordinary CPUs — the SPARQL queries this document links to, including the 71-row entailment demonstration in :sc1, execute against a public Virtuoso endpoint with no GPU involved at any point. 'Without needing Nvidia chips' is true of RDF triple stores too; the actual axis of comparison Sowa draws (conceptual graphs vs. GPU-heavy LLM/embedding systems) is a real and interesting one, but it is not a comparison between conceptual graphs and triple stores, so it cannot support a conclusion specifically against triple stores. No published benchmark comparing Permion against an equivalently-indexed triple store on equivalent hardware and workload is cited, so the architectural claim remains anecdotal rather than demonstrated."@en ;
    :correctedTurtle """GRAPH <urn:g:beethoven-1824-composition> {
  :beethovenNinthComposition a schema:CreateAction ;
      schema:agent :Beethoven ;
      schema:result :NinthSymphony ;
      schema:location :Vienna ;
      schema:startTime "1824"^^xsd:gYear .
}"""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
CONSTRUCT { :beethovenNinthComposition ?p ?o }
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl>
WHERE { :beethovenNinthComposition ?p ?o }"""^^xsd:string ;
    :reasoningEngine "Same query as :demoQ1 — verified live on a CPU-based Virtuoso quad store with sub-second response, demonstrating the 'no GPU needed' property Sowa attributes to Permion is not distinctive to non-RDF systems."@en ;
    :namedGraphExample <urn:g:beethoven-1824-composition> .

:s4 a :SowaObjectionClaim ; schema:isPartOf :sowaSection ;
    schema:position 4 ;
    schema:name "Triples are, at most, a legacy-import format for newer systems, not a first-class modeling primitive"@en ;
    :objectionText "Newer systems can easily accept triples from legacy software."@en ;
    schema:workExample :q16Sowa .

:q16Sowa a schema:Quotation ;
    schema:text "easily accept triples from legacy software"@en ;
    schema:citation :sowaPost .

:sc4 a :RDFCorrectionPattern, karp:CriticalPerspective ; schema:isPartOf :sowaSection ;
    karp:respondsTo :s4 ;
    schema:position 4 ;
    schema:name "'Easily accept' understates the actual advantage: triples merge without coordination, which is exactly the property new, mutually-unaware systems need going forward, not only when importing the past"@en ;
    schema:description "The framing treats triple-acceptance as a one-way legacy-compatibility feature. What actually makes triples mergeable without prior coordination is that RDF has no closed, negotiated schema to align first — two organizations that never talked to each other can publish RDF about the same real-world entity and have a third party union the results correctly, exactly as :c7's conflicting-claims demonstration and :demoQ9's cross-organization sameAs entailment (this document, this session) both show. That is a forward-looking interoperability property for systems that do not yet exist and have not yet agreed on anything, not a backward-looking accommodation for systems that already do."@en ;
    :correctedTurtle """GRAPH <urn:g:sourceA> { :Beethoven :birthPlace :Bonn }
GRAPH <urn:g:sourceB> { :Beethoven :birthPlace :Koblenz }"""^^xsd:string ;
    :correctedSparql """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?g ?place
FROM NAMED <urn:g:sourceA>
FROM NAMED <urn:g:sourceB>
WHERE { GRAPH ?g { :Beethoven :birthPlace ?place } }"""^^xsd:string ;
    :reasoningEngine "Same mechanism as :c7 — two independently-authored, uncoordinated graphs merge cleanly with both claims preserved and attributed, never averaged or silently dropped, which is the schema-free mergeability property new, mutually-unaware systems benefit from just as much as legacy-import scenarios do."@en ;
    :namedGraphExample <urn:g:sourceA> .

# =============================================================================
# Demo instance data + live SPARQL queries (real named graphs, not just prose)
# =============================================================================

:demoDataSection a schema:CreativeWork ; schema:isPartOf :analysis ;
    schema:name "Demo Instance Data"@en ;
    schema:description "The twelve corrections above are not only documented as Turtle/SPARQL snippets — they are instantiated as real instance data in a companion flat Turtle file, loadable into a quad store (e.g. Virtuoso) as a single named graph, or split across several named graphs using each correction's :namedGraphExample IRI as a starting point. The eleven SPARQL queries that run against this dataset are in the SPARQL Workbench below, not repeated here."@en ;
    schema:hasPart :demoDataset, :demoQ1, :demoQ2, :demoQ3, :demoQ4, :demoQ5, :demoQ6, :demoQ7, :demoQ8, :demoQ9, :demoQ10, :demoQ11 .

:demoDataset a schema:Dataset ; schema:isPartOf :demoDataSection ;
    schema:name "Companion Demo Dataset (Turtle)"@en ;
    schema:alternateName "why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl" ;
    schema:description "Holds the corrected instance triples for all twelve corrections, c1 through c12. Reification (rdf:Statement + prov:wasAttributedTo / :epistemicStatus / :contentHash) carries the source-attribution, epistemic-tier, and admission-envelope distinctions for c2, c3, c7, and c11. Load as one named graph, or split across several using each correction's :namedGraphExample as a starting point — the eleven SPARQL queries in the Workbench below run against it live."@en ;
    schema:encodingFormat "text/turtle"@en .

:demoQ1 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q1 — Reconstruct the whole event from one resource (answers f1/c1)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
CONSTRUCT { :beethovenNinthComposition ?p ?o }
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl>
WHERE {
  :beethovenNinthComposition ?p ?o .
}"""@en ;
    rdfs:comment "Verified live against the loaded demo dataset. Returns the whole schema:CreateAction event (agent, result, location, time) in one query — nothing about it was 'shattered'. If you load this event into its own named graph (see :c1 :namedGraphExample), swap the FROM/subject for GRAPH <that-iri> { ?event ?p ?o } for atomic graph-scoped retrieval."@en .

:demoQ2 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q2 — Conflicting birthplace claims returned with attribution, no averaging (answers f7/c7)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX prov: <http://www.w3.org/ns/prov#>
SELECT DISTINCT ?claim ?place ?source
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl>
WHERE {
  ?claim rdf:predicate :birthPlace ; rdf:object ?place ; prov:wasAttributedTo ?source .
}"""@en ;
    rdfs:comment "Verified live: returns BOTH :claimBirthPlaceBonn and :claimBirthPlaceKoblenz, each with its own source attribution — never a merged/averaged third place. Loading each claim into its own named graph (per :c7 :namedGraphExample) makes the same point via GRAPH ?g { :Beethoven :birthPlace ?place } instead of reification."@en .

:demoQ3 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q3 — List claims by epistemic tier (answers f3/c3)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?claim ?subject ?predicate ?object ?tier
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl>
WHERE {
  ?claim a rdf:Statement ;
      rdf:subject ?subject ; rdf:predicate ?predicate ; rdf:object ?object ;
      :epistemicStatus ?tier .
}"""@en ;
    rdfs:comment "Verified live: separates the documented birthplace fact (:DocumentedFact) from the inferred birth year (:Inferred) by claim-level :epistemicStatus — the tier a FuXi N3 rule would otherwise materialize from named-graph membership onto each triple."@en .

:demoQ4 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q4 — Bounded-grammar reasoning over an open predicate (answers f9/c9)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?person ?relation ?value
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl>
WHERE {
  ?person ?relation ?value .
  FILTER(?relation = :hasCitizenship)
}"""@en ;
    rdfs:comment "Verified live: Alice's citizenship is declared via :hasCitizenship, a rdfs:subPropertyOf :hasRelationalStatus — new relational predicates stay open-vocabulary while an RDFS reasoner keeps them bounded under the small superproperty set. Under RDFS entailment, ?relation = :hasRelationalStatus also matches via subproperty inference."@en .

:demoQ5 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q5 — OWL2 sameAs entailment with Virtuoso's reasoning pragma (answers f4/c4)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """DEFINE input:same-as "yes"
PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
ASK { :Beethoven a <http://dbpedia.org/ontology/Person> }"""@en ;
    rdfs:comment "Verified live both ways: WITHOUT the DEFINE input:same-as pragma this ASK returns false (:Beethoven carries no direct rdf:type to dbo:Person, only owl:sameAs to the DBpedia resource); WITH it, true — deterministic OWL2 entailment via Virtuoso's built-in same-as reasoning (no named ruleset needed), not a probabilistic similarity score. Deliberately has no FROM/GRAPH restriction: the entailment bridges our locally-asserted owl:sameAs triple with DBpedia's own rdf:type assertion, which lives in a different graph elsewhere in the store. See :demoQ9 for a SELECT variant showing the full scale of what gets entailed (71 types, not just one boolean)."@en .

:demoQ6 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q6 — Chronology independent of triple order (answers f8/c8)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX prov: <http://www.w3.org/ns/prov#>
SELECT DISTINCT ?first ?firstTime ?second ?secondTime
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl>
WHERE {
  ?first :precedes ?second .
  ?first prov:endedAtTime ?firstTime .
  ?second prov:startedAtTime ?secondTime .
}"""@en ;
    rdfs:comment "Verified live: explicit :precedes plus xsd:dateTime literals recover chronology (poisoning before death) regardless of narrative order."@en .

:demoQ7 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q7 — Speech-act on a reified statement, saying vs. said (answers f6/f10/c6/c10)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?statement ?subject ?predicate ?object ?speechAct
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl>
WHERE {
  ?statement a rdf:Statement ;
      rdf:subject ?subject ; rdf:predicate ?predicate ; rdf:object ?object ;
      :speechAct ?speechAct .
}"""@en ;
    rdfs:comment "Verified live: the reified statement (the defendant's utterance, and separately Beethoven's composition claim) carries its own :speechAct — belief-about-the-claim and the underlying triple are two distinct, independently queryable resources. RDF-star's <<...>> syntax expresses the same distinction more compactly, and already does on Virtuoso Open Source Edition; the commercial edition behind this document's live URIBurner endpoint will support these RDF release enhancements in an upcoming release, so reification is the verified mechanism used here."@en .

:demoQ8 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q8 — A claim's admission envelope: identity, provenance, lexical material, integrity (answers f11/c11)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX prov: <http://www.w3.org/ns/prov#>
SELECT DISTINCT ?claim ?subject ?predicate ?object ?attributedTo ?generatedAt ?hash
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/why-the-triple-is-the-wrong-grain-rebuttal-demo-data-claude_code-1.ttl>
WHERE {
  BIND(:claim42 AS ?claim)
  ?claim a rdf:Statement ;
      rdf:subject ?subject ; rdf:predicate ?predicate ; rdf:object ?object ;
      prov:wasAttributedTo ?attributedTo .
  OPTIONAL { ?claim prov:generatedAtTime ?generatedAt }
  OPTIONAL { ?claim :contentHash ?hash }
}"""@en ;
    rdfs:comment "Verified live (exactly one row): returns :claim42's identity (its own IRI), lexical material (rdf:subject/predicate/object), provenance (prov:wasAttributedTo/generatedAtTime), and integrity check (:contentHash) in one query — the four SGF 'admission context' fields, already RDF-native. Other reified claims in the dataset (:claimComposedNinth, :claimBirthPlaceBonn/Koblenz) also carry prov:wasAttributedTo but not generatedAtTime/contentHash — drop the BIND to compare all of them side by side. Packaging this claim as its own signed named graph (per :c11 :namedGraphExample) moves identity from the claim IRI to the graph IRI, same four fields."@en .

:demoQ9 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q9 — SELECT variant: every type :Beethoven gains via sameAs reasoning, not just true/false (answers f4/c4)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """DEFINE input:same-as "yes"
PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?type
WHERE { :Beethoven a ?type }"""@en ;
    rdfs:comment "Verified live: without the DEFINE input:same-as pragma this returns 2 rows (our own asserted schema:Person and :Composer); with it, 71 rows — the full type hierarchy (YAGO categories, schema.org, foaf, dbo, ...) that DBpedia's Ludwig_van_Beethoven resource carries, all entailed transitively through the single owl:sameAs link. A far more vivid demonstration of what OWL2 entailment actually pulls in than :demoQ5's bare true/false ASK — same underlying mechanism, richer evidence. See :demoQ11 for the same query with the pragma commented out, for a direct one-click A/B comparison."@en .

:demoQ10 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q10 — A/B baseline for Q5: same ASK with the reasoning pragma commented out (answers f4/c4)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """# DEFINE input:same-as "yes"   -- uncomment this line to enable reasoning and compare results
PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
ASK { :Beethoven a <http://dbpedia.org/ontology/Person> }"""@en ;
    rdfs:comment "Verified live: identical to :demoQ5 except the DEFINE input:same-as pragma is commented out (a plain SPARQL '#' comment, inert until you delete the leading '# '), so this returns false — no direct rdf:type assertion, only owl:sameAs. Uncomment that one line and re-run to see it flip to true, exactly as :demoQ5 does — the fastest way to see OWL2 entailment turn on and off for yourself."@en .

:demoQ11 a schema:SoftwareSourceCode ; schema:isPartOf :demoDataSection ;
    schema:name "Q11 — A/B baseline for Q9: same SELECT with the reasoning pragma commented out (answers f4/c4)"@en ;
    schema:programmingLanguage "SPARQL"@en ;
    schema:text """# DEFINE input:same-as "yes"   -- uncomment this line to enable reasoning and compare results
PREFIX : <https://medium.com/@JamesStakelum/why-the-triple-is-the-wrong-grain-1cad99e136f4#>
SELECT DISTINCT ?type
WHERE { :Beethoven a ?type }"""@en ;
    rdfs:comment "Verified live: identical to :demoQ9 except the DEFINE input:same-as pragma is commented out, so this returns only 2 rows (our own asserted schema:Person and :Composer) instead of 71. Uncomment that one line and re-run to watch the full DBpedia type hierarchy — YAGO categories, schema.org, foaf, dbo — flood in through the single owl:sameAs link, exactly as :demoQ9 does."@en .

# =============================================================================
# FAQ (>= 12)
# =============================================================================

:faqSection a schema:FAQPage ;
    schema:isPartOf :analysis ;
    schema:name "Frequently Asked Questions"@en ;
    schema:mainEntity :q1, :q2, :q3, :q4, :q5, :q6, :q7, :q8, :q9, :q10, :q11, :q12 .

:q1 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Does RDF really 'shatter' events into disconnected triples?"@en ;
    schema:acceptedAnswer :a1 .
:a1 a schema:Answer ;
    schema:text "No. The event is modeled as its own resource (e.g. a schema:CreateAction or PROV-O Activity), and the individual triples describe that one resource's properties. Retrieval targets the event IRI or its named graph and reconstitutes the whole event in one query — see :c1."@en .

:q2 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Is provenance truly optional in RDF, as the article claims?"@en ;
    schema:acceptedAnswer :a2 .
:a2 a schema:Answer ;
    schema:text "No. In a quad store (the deployment norm for RDF today, including Virtuoso), every triple is stored as a quad with a graph component. Provenance is structurally mandatory at the storage layer; PROV-O then adds a typed attribution vocabulary on top — see :c2."@en .

:q3 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Can RDF distinguish a documented fact from an inference?"@en ;
    schema:acceptedAnswer :a3 .
:a3 a schema:Answer ;
    schema:text "Yes, via epistemic-tier named graphs plus a forward-chaining rule (FuXi N3, or an equivalent Virtuoso SPARQL INSERT) that materializes the tier onto every triple in that graph — see :c3."@en .

:q4 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "How does RDF disambiguate a URI like :Beethoven from other entities with similar names?"@en ;
    schema:acceptedAnswer :a4 .
:a4 a schema:Answer ;
    schema:text "Via owl:sameAs to a canonical Linked Data identity (DBpedia/Wikidata), closed transitively under OWL2 entailment. This is a deterministic dereference, not the probabilistic similarity the article claims RDF is limited to — see :c4."@en .

:q5 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Can an RDF/OWL class definition capture an object's purpose, not just its structural parts?"@en ;
    schema:acceptedAnswer :a5 .
:a5 a schema:Answer ;
    schema:text "Yes — a purpose/function datatype property is ordinary RDF, and a SHACL shape can make it mandatory for every instance of the class, closing the gap the article's under-specified example leaves open — see :c5."@en .

:q6 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Can RDF distinguish 'the defendant said X' from 'X is true'?"@en ;
    schema:acceptedAnswer :a6 .
:a6 a schema:Answer ;
    schema:text "Yes — via classic rdf:Statement reification (verified live against this document's own dataset), or RDF 1.2's more compact RDF-star quoted-triple syntax where the endpoint supports it: either way, the utterance becomes its own addressable node that a separate :speechAct/:assertedBy annotation attaches to, structurally separating utterance from truth-claim — see :c6."@en .

:q7 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Does querying conflicting RDF sources produce a hallucinated averaged answer?"@en ;
    schema:acceptedAnswer :a7 .
:a7 a schema:Answer ;
    schema:text "No. Conformant SPARQL 1.1 has no averaging operator; a GRAPH-scoped SELECT returns each source's claim labeled by its named graph, and any reconciliation is an explicit, auditable application-level rule — see :c7."@en .

:q8 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Does RDF collapse chronological order and narrative order into a single sequence?"@en ;
    schema:acceptedAnswer :a8 .
:a8 a schema:Answer ;
    schema:text "No — RDF triples form an unordered set and never encoded narrative order to begin with, so there is nothing to collapse. Chronology is asserted explicitly via xsd:dateTime literals and a transitive :precedes property, independent of triple or document order — see :c8."@en .

:q9 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Does every relational noun (citizenship, employment, ownership) really need a brand-new RDF predicate?"@en ;
    schema:acceptedAnswer :a9 .
:a9 a schema:Answer ;
    schema:text "New predicates are declared, but rdfs:subPropertyOf lets them inherit reasoning behavior from a small, bounded set of superproperties — the same open-vocabulary/closed-grammar split SGF itself relies on — see :c9."@en .

:q10 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Can an RDF triple carry a communicative intent like INFORM, QUERY, or COMMAND?"@en ;
    schema:acceptedAnswer :a10 .
:a10 a schema:Answer ;
    schema:text "Yes — via a closed, SKOS-typed act-type vocabulary attached to a reified statement (verified live), an RDF-star annotation on the quoted triple where supported, or on the statement's containing named graph. This capability was simply absent from the article's examples, not from RDF itself — see :c10."@en .

:q11 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Does RDF provide an 'admission envelope' (identity, provenance, lexical material, integrity) for cross-system claim exchange?"@en ;
    schema:acceptedAnswer :a11 .
:a11 a schema:Answer ;
    schema:text "Yes — a signed named graph serialized as TriG already supplies all four fields: the graph IRI is identity, PROV-O properties are provenance, the triples are the lexical material, and a content-hash literal (or detached signature) is integrity — see :c11."@en .

:q12 a schema:Question ; schema:isPartOf :faqSection ;
    schema:name "Is RDF/OWL alignment between equivalent terms only ever probabilistic?"@en ;
    schema:acceptedAnswer :a12 .
:a12 a schema:Answer ;
    schema:text "No — owl:equivalentClass/equivalentProperty under OWL2's formal semantics gives deterministic, provable entailment, computed by a description-logic reasoner (Virtuoso's built-in engine or an external DL reasoner) — see :c12."@en .

# =============================================================================
# Glossary (>= 10, mixing locally-coined and reused external terms)
# =============================================================================

:glossarySection a skos:ConceptScheme, schema:DefinedTermSet ;
    schema:isPartOf :analysis ;
    schema:name "Glossary"@en ;
    schema:hasDefinedTerm :termTriple, :termNamedGraph, :termRdfStar, :termProvO, :termShacl,
        :termOwl2Entailment, :termFuxi, :termVirtuosoQuadStore, :termSgfSynapse, :termEpistemicTier,
        :sgfVerbHub .

:termTriple a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "RDF Triple"@en ;
    schema:description "The atomic RDF statement (subject, predicate, object) — the unit the article argues is the wrong grain for meaning transport, and which this rebuttal argues is adequate once paired with named graphs, RDF-star, PROV-O, and reasoning."@en .

:termNamedGraph a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "Named Graph"@en ;
    schema:description "An IRI-identified set of triples, forming the fourth (graph) column of an RDF quad; the storage-level mechanism this rebuttal uses to carry provenance, source separation, and epistemic tier."@en .

:termRdfStar a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "RDF-star / RDF 1.2 Quoted Triples"@en ;
    schema:description "The RDF 1.2 extension letting a whole triple be quoted and used as the subject or object of another triple, enabling statements about statements — used conceptually here to separate an utterance from a truth-claim about it, though :c6/:c10's live-verified demonstrations use classic rdf:Statement reification instead, since the commercial edition behind this document's live URIBurner endpoint will support these RDF release enhancements in an upcoming release (Virtuoso Open Source Edition already does)."@en .

:termProvO a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "PROV-O"@en ;
    schema:description "The W3C PROV Ontology for representing provenance: entities, activities, and agents, and the relations between them (wasAttributedTo, wasGeneratedBy, generatedAtTime) — used here as the provenance layer for named-graph corrections."@en .

:termShacl a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "SHACL"@en ;
    schema:description "The Shapes Constraint Language for validating RDF graphs against structural constraints; used here to make a purpose/function property mandatory on a class of instances."@en .

:termOwl2Entailment a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "OWL2 Entailment"@en ;
    schema:description "The formally specified, model-theoretic derivation of new facts from asserted OWL2 axioms (e.g. owl:equivalentClass, owl:sameAs, transitive property chains), computed deterministically by a description-logic reasoner."@en .

:termFuxi a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "FuXi"@en ;
    schema:description "An open-source Python-based logic reasoning system implementing N3/RIF forward-chaining rules over RDF graphs; used here to materialize epistemic-tier annotations from named-graph membership."@en .

:termVirtuosoQuadStore a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "Virtuoso Quad Store"@en ;
    schema:description "OpenLink Virtuoso's storage model, in which every RDF triple is physically stored as a (subject, predicate, object, graph) quad, with built-in RDFS++/OWL2-QL entailment, SPARQL 1.1, and SHACL validation confirmed working against this document's own dataset. Virtuoso Open Source Edition already supports RDF 1.2 (RDF-star) quoted-triple syntax; the commercial edition behind the live URIBurner instance this document links to will support these RDF release enhancements in an upcoming release, so classic rdf:Statement reification is the confirmed mechanism used throughout this document instead."@en .

:termSgfSynapse a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "SGF Synapse"@en ;
    schema:description "The article's proposed replacement claim structure: a VerbHub with 15 fixed semantic-role spokes, a Derivation Tag, and a 7-tier epistemic hierarchy, governed by a closed grammar plus an open concept vocabulary."@en .

:termEpistemicTier a schema:DefinedTerm, skos:Concept ; schema:isPartOf :glossarySection ;
    schema:name "Epistemic Tier"@en ;
    schema:description "A classification of a claim's certainty (fact, inference, guess, etc.); modeled in this rebuttal as named-graph membership materialized into a per-triple annotation via a FuXi N3 rule — see :sgfEpistemicHierarchy for the article's own seven-tier version (CORE_DEFINITION, CONSTITUTIVE, SOURCED, CLAIMED, INFERRED, PROVISIONAL, GHOST)."@en .

# =============================================================================
# HowTo — one step per failure/correction pair (actionable)
# =============================================================================

:howtoSection a schema:HowTo ;
    schema:isPartOf :analysis ;
    schema:name "How to Answer Each SGF Failure Claim With Working RDF"@en ;
    schema:description "Twelve actionable steps, one per alleged failure, for modeling the same content in production RDF so the alleged failure does not arise."@en ;
    schema:step :step1, :step2, :step3, :step4, :step5, :step6, :step7, :step8, :step9, :step10, :step11, :step12 .

:step1 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 1 ;
    schema:name "Model the event as a resource, not a scattered set of edges"@en ;
    schema:text "Give the event its own IRI, type it (schema:CreateAction, prov:Activity, etc.), and attach agent/patient/location/time as properties of that one resource, ideally inside a dedicated named graph. See :c1."@en .

:step2 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 2 ;
    schema:name "Put every asserted triple inside a source-attributed named graph"@en ;
    schema:text "Never assert bare triples in the default graph when provenance matters; use GRAPH <source-IRI> and attach prov:wasAttributedTo to that graph IRI. See :c2."@en .

:step3 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 3 ;
    schema:name "Tier claims by named graph and materialize epistemic status with a rule"@en ;
    schema:text "Separate documented facts, inferences, and guesses into distinct named graphs, then run a FuXi N3 rule (or SPARQL INSERT) that stamps each graph's tier onto its member triples. See :c3."@en .

:step4 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 4 ;
    schema:name "Link every ambiguous local URI to a canonical Linked Data identity"@en ;
    schema:text "Add owl:sameAs to DBpedia/Wikidata (or an equivalent authority) and let OWL2 entailment close the identity graph transitively for deterministic disambiguation. See :c4."@en .

:step5 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 5 ;
    schema:name "Require a purpose/function property with SHACL"@en ;
    schema:text "Add a purpose or function datatype property to the class and enforce sh:minCount 1 on it via a SHACL shape so no instance can omit it. See :c5."@en .

:step6 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 6 ;
    schema:name "Quote the statement to separate utterance from truth-claim"@en ;
    schema:text "Reify the triple recording what was said (or use RDF-star where the endpoint supports it), then attach :speechAct/:assertedBy to that statement rather than asserting its content directly. See :c6."@en .

:step7 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 7 ;
    schema:name "Query conflicting sources with GRAPH-scoping, never merge by default"@en ;
    schema:text "Keep each source's claims in its own named graph and use GRAPH-scoped SELECT to surface all claims with attribution; write any reconciliation as an explicit, reviewable CONSTRUCT rule. See :c7."@en .

:step8 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 8 ;
    schema:name "Assert chronology explicitly, independent of triple order"@en ;
    schema:text "Use xsd:dateTime literals and a transitive :precedes/prov:startedAtTime chain to encode chronological order; never rely on the order triples happen to be written or read. See :c8."@en .

:step9 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 9 ;
    schema:name "Declare new relational predicates as rdfs:subPropertyOf a bounded superproperty set"@en ;
    schema:text "When a new relational noun needs a predicate, declare it as a subproperty of an existing, small superproperty set so reasoning stays bounded while vocabulary stays open. See :c9."@en .

:step10 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 10 ;
    schema:name "Annotate communicative intent on the quoted triple or its graph"@en ;
    schema:text "Attach a closed, SKOS-typed :speechAct value (INFORM, QUERY, COMMAND, ...) to the reified statement, an RDF-star-quoted triple where supported, or the statement's containing named graph. See :c10."@en .

:step11 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 11 ;
    schema:name "Package claims for exchange as signed TriG named graphs"@en ;
    schema:text "Wrap the claim's triples in a named graph, attach PROV-O attribution/timestamp properties, and add a content-hash or detached signature over the canonicalized serialization before transmitting. See :c11."@en .

:step12 a schema:HowToStep ; schema:isPartOf :howtoSection ; schema:position 12 ;
    schema:name "Reconcile equivalent terms with owl:equivalentClass/equivalentProperty, not embeddings"@en ;
    schema:text "Assert owl:equivalentClass or owl:equivalentProperty between reconciled terms and let a description-logic reasoner (Virtuoso's built-in engine, HermiT, or Pellet) compute deterministic entailment. See :c12."@en .
