## ============================================================
## Knowledge Graph: Ontology IS Code
## Tony Seale — LinkedIn Post
## Source: https://www.linkedin.com/posts/tonyseale_did-you-start-building-your-ontology-as-a-share-7463353332565356545-jY54/
## Generated: 2026-05-22 | Model: Claude Sonnet 4.6 (Cowork)
## Skills: kg-generator, rdf-infographic-skill
## ============================================================

@prefix :       <https://www.linkedin.com/posts/tonyseale_did-you-start-building-your-ontology-as-a-share-7463353332565356545-jY54/#> .
@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:    <http://www.w3.org/2002/07/owl#> .
@prefix schema: <http://schema.org/> .
@prefix skos:   <http://www.w3.org/2004/02/skos/core#> .
@prefix prov:   <http://www.w3.org/ns/prov#> .
@prefix dcterms:<http://purl.org/dc/terms/> .
@prefix xsd:    <http://www.w3.org/2001/XMLSchema#> .

## ── Ontology Declaration ─────────────────────────────────────────

: a owl:Ontology ;
  schema:name "Ontology IS Code — Tony Seale LinkedIn Post KG" ;
  schema:description "Knowledge graph encoding Tony Seale's argument that ontologies should be treated as source code: compiled, versioned in plain text, and governed with the same rigour applied to application code." ;
  schema:identifier "https://www.linkedin.com/posts/tonyseale_did-you-start-building-your-ontology-as-a-share-7463353332565356545-jY54/"^^xsd:anyURI ;
  rdfs:label "Ontology IS Code KG" ;
  rdfs:comment "Lightweight knowledge graph derived from Tony Seale's LinkedIn post on ontology engineering best practices, including three core principles, commentator insights, FAQ, glossary, and HowTo." ;
  owl:versionInfo "1.0" ;
  dcterms:created "2026-05-22"^^xsd:date ;
  dcterms:source "https://www.linkedin.com/posts/tonyseale_did-you-start-building-your-ontology-as-a-share-7463353332565356545-jY54/"^^xsd:anyURI .

## ── Custom Classes ────────────────────────────────────────────────

:OntologyPrinciple a owl:Class ;
  rdfs:label "Ontology Principle" ;
  rdfs:comment "A guiding principle for treating ontologies as engineering artefacts rather than data stores" ;
  rdfs:isDefinedBy : .

:CommentatorInsight a owl:Class ;
  rdfs:label "Commentator Insight" ;
  rdfs:comment "A perspective or reaction contributed by a thread participant in response to the main post" ;
  rdfs:isDefinedBy : .

:EngineeringParallel a owl:Class ;
  rdfs:label "Engineering Parallel" ;
  rdfs:comment "A direct analogy drawn between established software engineering practice and a recommended ontology practice" ;
  rdfs:isDefinedBy : .

## ── Custom Properties ─────────────────────────────────────────────

:hasPrinciple a owl:ObjectProperty ;
  rdfs:label "has principle" ;
  rdfs:comment "Connects a post or argument to one of its constituent ontology-as-code principles" ;
  rdfs:isDefinedBy : .

:hasParallel a owl:ObjectProperty ;
  rdfs:label "has parallel" ;
  rdfs:comment "Connects a principle to its corresponding software engineering parallel" ;
  rdfs:isDefinedBy : .

:elicitedInsight a owl:ObjectProperty ;
  rdfs:label "elicited insight" ;
  rdfs:comment "Connects the main post to a commentator insight it provoked" ;
  rdfs:isDefinedBy : .

## ── Source Post ───────────────────────────────────────────────────

:post a schema:SocialMediaPosting ;
  schema:name "Did you start building your ontology as a set of rows in a custom database table?" ;
  schema:headline "Ontology IS Code" ;
  schema:url "https://www.linkedin.com/posts/tonyseale_did-you-start-building-your-ontology-as-a-share-7463353332565356545-jY54/"^^xsd:anyURI ;
  schema:datePublished "2026-05-22"^^xsd:date ;
  schema:author <https://www.linkedin.com/in/tonyseale/#this> ;
  schema:publisher :linkedInPlatform ;
  schema:description """Tony Seale argues that an ontology is not a database artefact but logic — formal, expressive, a graph of interrelated concepts built on rigorous axioms. It should compile, live in plain text with full version-control tooling, and be governed with branches, pull requests, reviews, and automated checks. His conclusion: 'Your ontology is source code for your meaning.'""" ;
  schema:keywords "ontology, knowledge graph, semantic web, software engineering, version control, formal logic, OWL, RDF Turtle, CI/CD, LLM" ;
  :hasPrinciple :compilePrinciple, :plainTextPrinciple, :governancePrinciple ;
  :elicitedInsight :kingsleyInsight, :juanInsight, :nicolasInsight, :robertSandersonInsight, :veronikaInsight, :gauravInsight ;
  schema:hasPart :principlesSection, :commentatorsSection, :faqSection, :glossarySection, :howtoSection ;
  prov:wasGeneratedBy :kgGeneratorSkill .

## ── Platform ──────────────────────────────────────────────────────

:linkedInPlatform a schema:WebSite ;
  schema:name "LinkedIn" ;
  schema:url "https://www.linkedin.com/"^^xsd:anyURI ;
  owl:sameAs <http://dbpedia.org/resource/LinkedIn> .

## ── Author ────────────────────────────────────────────────────────

<https://www.linkedin.com/in/tonyseale/#this> a schema:Person ;
  schema:name "Tony Seale" ;
  schema:jobTitle "The Knowledge Graph Guy" ;
  schema:url "https://www.linkedin.com/in/tonyseale/"^^xsd:anyURI ;
  schema:description "Knowledge graph practitioner and advocate for treating ontologies as first-class engineering artefacts." ;
  schema:sameAs "https://www.linkedin.com/in/tonyseale/"^^xsd:anyURI .

## ── Commentators ──────────────────────────────────────────────────

<https://www.linkedin.com/in/kidehen/#this> a schema:Person ;
  schema:name "Kingsley Uyi Idehen" ;
  schema:jobTitle "Founder & CEO at OpenLink Software" ;
  schema:url "https://www.linkedin.com/in/kidehen/"^^xsd:anyURI ;
  schema:worksFor :openLinkSoftware ;
  schema:description "Founder of OpenLink Software; advocates for LLM-powered AI Agents working directly with RDF files and filesystem-bound quad stores." .

<https://www.linkedin.com/in/juansequeda/#this> a schema:Person ;
  schema:name "Juan Sequeda" ;
  schema:jobTitle "Principal Data Strategist & Researcher at ServiceNow" ;
  schema:url "https://www.linkedin.com/in/juansequeda/"^^xsd:anyURI ;
  schema:worksFor :serviceNow ;
  schema:description "20-year knowledge graph and ontology veteran; co-host of Catalog & Cocktails podcast; warns about vendors reframing themselves as ontology tools." .

:nicolasMatentzoglu a schema:Person ;
  schema:name "Nicolas Matentzoglu" ;
  schema:jobTitle "Independent Consultant — Semantic Technology & Knowledge Engineering" ;
  schema:description "Noted that highly regular large ontologies (>10K entities) such as anatomy or chemistry can sometimes be curated in tables and mapped to design patterns." .

:robertSanderson a schema:Person ;
  schema:name "Robert Sanderson" ;
  schema:jobTitle "Senior Director for Digital Cultural Heritage, Yale University" ;
  schema:worksFor :yaleUniversity ;
  schema:description "Raised the question of whether vocabularies and taxonomies should also be treated as code, distinct from full ontologies." .

:veronikaHeimsbakk a schema:Person ;
  schema:name "Veronika Heimsbakk" ;
  schema:jobTitle "Knowledge Graph Specialist, Author, Speaker" ;
  schema:description "Shared the RDF Vendor Landscape resource and demonstrated that migrating from tables to Turtle can take as few as four lines of Python." .

:gauravMalhotra a schema:Person ;
  schema:name "Gaurav Malhotra" ;
  schema:jobTitle "Founder, HyperGraphMind" ;
  schema:worksFor :hyperGraphMind ;
  schema:description "Argued for projecting ontology as typed Python objects so developers use familiar programming models while governance remains in Turtle." .

:stephenRedmond a schema:Person ;
  schema:name "Stephen Redmond" ;
  schema:jobTitle "Founder, Straitéis AI" ;
  schema:description "Endorsed Turtle as the coding language of choice for ontologies due to its compatibility with SDLC tooling." .

:basVanDerRaadt a schema:Person ;
  schema:name "Bas van der Raadt, PhD" ;
  schema:jobTitle "Enterprise Ontologist, CTO & Founder hapsah.org" ;
  schema:description "Noted that ontology-driven systems involve more than RDF syntax, and that snapshot artefacts still arise even with a code-like approach." .

## ── Organizations ─────────────────────────────────────────────────

:openLinkSoftware a schema:Organization ;
  schema:name "OpenLink Software" ;
  schema:url "https://www.openlinksw.com/"^^xsd:anyURI ;
  schema:description "Creator of Virtuoso Universal Server and OpenLink Data Spaces; advocates filesystem-bound RDF stores updated transparently by placing files in designated folders." .

:serviceNow a schema:Organization ;
  schema:name "ServiceNow" ;
  schema:url "https://www.servicenow.com/"^^xsd:anyURI ;
  owl:sameAs <http://dbpedia.org/resource/ServiceNow> .

:yaleUniversity a schema:Organization ;
  schema:name "Yale University" ;
  schema:url "https://www.yale.edu/"^^xsd:anyURI ;
  owl:sameAs <http://dbpedia.org/resource/Yale_University> .

:hyperGraphMind a schema:Organization ;
  schema:name "HyperGraphMind" ;
  schema:description "Company building AI that reasons, proves, and earns enterprise trust via knowledge graphs." .

## ── Three Core Principles ─────────────────────────────────────────

:principlesSection a schema:ArticleSection ;
  schema:name "Three Principles of Ontology as Code" ;
  schema:hasPart :compilePrinciple, :plainTextPrinciple, :governancePrinciple ;
  schema:isPartOf :post .

:post schema:hasPart :principlesSection .

:compilePrinciple a :OntologyPrinciple ;
  schema:name "Ontologies Should Compile" ;
  schema:description """An ontology must not merely parse — it must compile. Syntax must be valid, all classes satisfiable, and all entailments exactly as expected. An absent entailment is a test failure. If the model asserts two contradictory facts, the build must break. Shipping an ontology that contradicts itself is equivalent to shipping application code that crashes on import.""" ;
  :hasParallel :buildSystemParallel .

:plainTextPrinciple a :OntologyPrinciple ;
  schema:name "Ontologies Should Live in Plain Text" ;
  schema:description """Ontology source should be plain text files — not database rows. Files give you diffs, branches, blame, pull requests, and review in context. This is especially critical now that LLMs are in the loop: you want the LLM to read, navigate, and edit the ontology source directly, exactly as it works with a codebase, not only through an API or MCP server.""" ;
  :hasParallel :versionControlParallel .

:governancePrinciple a :OntologyPrinciple ;
  schema:name "Ontologies Should Be Governed Like Code" ;
  schema:description """Branches, pull requests, reviews, automated checks, releases, and builds — none of this needs inventing. Engineering organisations already do all of it. The artefact that decides what the organisation means by a customer, an order, a risk, or a product should not be governed less rigorously than the CSS on the marketing site.""" ;
  :hasParallel :devOpsParallel .

## ── Engineering Parallels ─────────────────────────────────────────

:buildSystemParallel a :EngineeringParallel ;
  schema:name "Build System Parallel" ;
  schema:description "A SPARQL reasoner or OWL DL reasoner as a compiler; failed satisfiability checks as build errors; missing entailments as failing unit tests." .

:versionControlParallel a :EngineeringParallel ;
  schema:name "Version Control Parallel" ;
  schema:description "Git for ontology files provides the same diff, branch, blame, and pull-request workflow used for application code — and enables LLMs to navigate and edit source directly." .

:devOpsParallel a :EngineeringParallel ;
  schema:name "DevOps Parallel" ;
  schema:description "CI/CD pipelines with automated ontology validation, branching strategies, review gates, and semantic versioning for knowledge engineering." .

## ── Commentator Insights ──────────────────────────────────────────

:commentatorsSection a schema:ArticleSection ;
  schema:name "Thread Commentator Insights" ;
  schema:hasPart :kingsleyInsight, :juanInsight, :nicolasInsight, :robertSandersonInsight, :veronikaInsight, :gauravInsight ;
  schema:isPartOf :post .

:post schema:hasPart :commentatorsSection .

:kingsleyInsight a :CommentatorInsight ;
  schema:name "LLMs and RDF Files as a Natural Ecosystem" ;
  schema:description """Kingsley Idehen argues that LLMs and the Semantic Web stack gel naturally. You can ask an AI Agent to express conceptualisations in any RDF notation and save to a file; with the right platform, files copied to a folder transparently update a backend quad store. LLM-powered Agents with appropriate Skills make this a 'zillion times easier'.""" ;
  schema:author <https://www.linkedin.com/in/kidehen/#this> .

:juanInsight a :CommentatorInsight ;
  schema:name "Caution About New Ontology Tool Vendors" ;
  schema:description """Juan Sequeda warns that everyone should be very careful with new tools and vendors that are reframing themselves as ontology tools, implying vendor claims should be scrutinised against the compile-branch-govern standard.""" ;
  schema:author <https://www.linkedin.com/in/juansequeda/#this> .

:nicolasInsight a :CommentatorInsight ;
  schema:name "Highly Regular Ontologies May Tolerate Table-Driven Curation" ;
  schema:description """For large (>10K entity) highly regular ontologies such as anatomy, biological traits, or chemistry, it is sometimes acceptable to curate in a table and map each instance to a design pattern — provided the mapping is governed and produces valid, compilable output.""" ;
  schema:author :nicolasMatentzoglu .

:robertSandersonInsight a :CommentatorInsight ;
  schema:name "Vocabulary vs Ontology Distinction Matters" ;
  schema:description """Robert Sanderson raises whether vocabularies and taxonomies should also be treated as code, noting that large regular knowledge bases may be closer to vocabularies than full ontologies and asking whether the same code-governance argument applies.""" ;
  schema:author :robertSanderson .

:veronikaInsight a :CommentatorInsight ;
  schema:name "Four Lines of Python to Migrate from Table to Turtle" ;
  schema:description """Veronika Heimsbakk demonstrates that migrating an ontology from an EAV table to RDF Turtle can require as few as four lines of Python, and shares the RDF Vendor Landscape resource for tooling overview.""" ;
  schema:author :veronikaHeimsbakk .

:gauravInsight a :CommentatorInsight ;
  schema:name "Ontology as Typed Python Objects — Executable Ubiquitous Language" ;
  schema:description """Gaurav Malhotra proposes projecting ontology as typed Python objects using @kgbo decorators so engineers interact with familiar programming models. Ontology remains governed logic; developer experience feels like engineering with types, diffs, and PRs.""" ;
  schema:author :gauravMalhotra .

## ── External Resources ────────────────────────────────────────────

:mcOntology a schema:WebPage ;
  schema:name "McOntology" ;
  schema:url "https://lnkd.in/e_5YqTPe"^^xsd:anyURI ;
  schema:description "Resource linked by Tony Seale on ontology engineering practice." .

:kgGuysPodcast a schema:WebPage ;
  schema:name "The Knowledge Graph Guys" ;
  schema:url "https://lnkd.in/eMQwyBpj"^^xsd:anyURI ;
  schema:description "Community or podcast linked by Tony Seale for further knowledge graph discussion." .

:rdfVendorLandscape a schema:WebPage ;
  schema:name "RDF Vendor Landscape" ;
  schema:url "https://veleda.github.io/rdf-vendor-landscape/"^^xsd:anyURI ;
  schema:description "Overview of RDF-native tooling and what major vendors support, shared by Veronika Heimsbakk." .

## ── SPARQL Query Examples ─────────────────────────────────────────

:sparqlQuery1 a schema:SoftwareSourceCode ;
  schema:name "Ontology Principles and Descriptions" ;
  schema:programmingLanguage "SPARQL" ;
  schema:runtimePlatform "SPARQL 1.1" ;
  schema:codeRepository "https://linkeddata.uriburner.com/sparql"^^xsd:anyURI ;
  schema:description "List all three ontology-as-code principles with their names and full descriptions." ;
  schema:codeValue """PREFIX schema: <http://schema.org/>
PREFIX : <https://www.linkedin.com/posts/tonyseale_did-you-start-building-your-ontology-as-a-share-7463353332565356545-jY54/#>

SELECT ?principle ?name ?description
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/tony-seale-ontology-is-code-claude_sonnet4.ttl>
WHERE {
  ?principle a :OntologyPrinciple ;
             schema:name ?name ;
             schema:description ?description .
}
ORDER BY ?name""" .

:sparqlQuery2 a schema:SoftwareSourceCode ;
  schema:name "Persons and Organizational Affiliations" ;
  schema:programmingLanguage "SPARQL" ;
  schema:runtimePlatform "SPARQL 1.1" ;
  schema:codeRepository "https://linkeddata.uriburner.com/sparql"^^xsd:anyURI ;
  schema:description "List all persons mentioned in the post and thread, with their job titles and organizational affiliations." ;
  schema:codeValue """PREFIX schema: <http://schema.org/>

SELECT ?person ?name ?title ?org
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/tony-seale-ontology-is-code-claude_sonnet4.ttl>
WHERE {
  ?person a schema:Person ;
          schema:name ?name .
  OPTIONAL { ?person schema:jobTitle ?title . }
  OPTIONAL { ?person schema:worksFor ?orgNode . ?orgNode schema:name ?org . }
}
ORDER BY ?name""" .

:sparqlQuery3 a schema:SoftwareSourceCode ;
  schema:name "Commentator Insights" ;
  schema:programmingLanguage "SPARQL" ;
  schema:runtimePlatform "SPARQL 1.1" ;
  schema:codeRepository "https://linkeddata.uriburner.com/sparql"^^xsd:anyURI ;
  schema:description "List all commentator insights from the LinkedIn thread with the author and key point." ;
  schema:codeValue """PREFIX schema: <http://schema.org/>
PREFIX : <https://www.linkedin.com/posts/tonyseale_did-you-start-building-your-ontology-as-a-share-7463353332565356545-jY54/#>

SELECT ?insight ?name ?authorName
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/tony-seale-ontology-is-code-claude_sonnet4.ttl>
WHERE {
  ?insight a :CommentatorInsight ;
           schema:name ?name ;
           schema:author ?author .
  ?author schema:name ?authorName .
}
ORDER BY ?authorName""" .

:sparqlQuery4 a schema:SoftwareSourceCode ;
  schema:name "Engineering Parallels" ;
  schema:programmingLanguage "SPARQL" ;
  schema:runtimePlatform "SPARQL 1.1" ;
  schema:codeRepository "https://linkeddata.uriburner.com/sparql"^^xsd:anyURI ;
  schema:description "List the software engineering parallels drawn to ontology practice, with their descriptions." ;
  schema:codeValue """PREFIX schema: <http://schema.org/>
PREFIX : <https://www.linkedin.com/posts/tonyseale_did-you-start-building-your-ontology-as-a-share-7463353332565356545-jY54/#>

SELECT ?parallel ?name ?description
FROM <https://linkeddata.uriburner.com/DAV/demos/daas/tony-seale-ontology-is-code-claude_sonnet4.ttl>
WHERE {
  ?parallel a :EngineeringParallel ;
            schema:name ?name ;
            schema:description ?description .
}
ORDER BY ?name""" .

## ── FAQ ───────────────────────────────────────────────────────────

:faqSection a schema:FAQPage ;
  schema:name "Frequently Asked Questions — Ontology IS Code" ;
  schema:mainEntity :q1, :q2, :q3, :q4, :q5, :q6, :q7, :q8, :q9, :q10, :q11, :q12 ;
  schema:isPartOf :post .

:post schema:hasPart :faqSection .

:q1 a schema:Question ;
  schema:name "What does 'Ontology IS Code' mean?" ;
  schema:acceptedAnswer :a1 .

:a1 a schema:Answer ;
  schema:text "It means an ontology should be treated as a first-class software engineering artefact: written in plain text, compiled to check correctness, version-controlled with Git, governed through pull requests and automated checks, and released with semantic versioning — not stored as rows in a custom database table." .

:q2 a schema:Question ;
  schema:name "Why do software engineers instinctively put ontologies in databases?" ;
  schema:acceptedAnswer :a2 .

:a2 a schema:Answer ;
  schema:text "Because software engineers have spent careers modelling customers, orders, and events as database rows. When an organisation asks for an ontology, the database is the familiar tool. The instinct is understandable but wrong: an ontology is logic, not data." .

:q3 a schema:Question ;
  schema:name "What does it mean for an ontology to compile?" ;
  schema:acceptedAnswer :a3 .

:a3 a schema:Answer ;
  schema:text "Compilation means more than parsing. It means running a reasoner that verifies: all syntax is valid, all classes are satisfiable, and all expected entailments hold. An absent entailment is a test failure. Two contradictory axioms should break the build, exactly as a type error breaks compilation of application code." .

:q4 a schema:Question ;
  schema:name "Why should an ontology live in plain text files?" ;
  schema:acceptedAnswer :a4 .

:a4 a schema:Answer ;
  schema:text "Plain text gives you diffs, branches, line-level blame, pull requests, and review in context — the same capabilities developers rely on for all other code. It is especially important now that LLMs are in the loop: you want the LLM to read, navigate, and edit ontology source directly, not only through an API or MCP server." .

:q5 a schema:Question ;
  schema:name "How should ontologies be governed?" ;
  schema:acceptedAnswer :a5 .

:a5 a schema:Answer ;
  schema:text "With branches, pull requests, code review, automated CI checks (syntax validation, reasoner runs, regression tests), and formal releases. None of this needs inventing — engineering organisations already do all of it for application code. The artefact defining organisational meaning should not be governed less rigorously than marketing CSS." .

:q6 a schema:Question ;
  schema:name "What role should LLMs play in ontology development?" ;
  schema:acceptedAnswer :a6 .

:a6 a schema:Answer ;
  schema:text "LLMs should have direct access to ontology source files — to read, navigate, and edit them — not only indirect access through APIs. Plain-text RDF (Turtle, OWL/Manchester) is human-readable shorthand that LLMs handle well, enabling AI-assisted authoring and review within standard VCS workflows." .

:q7 a schema:Question ;
  schema:name "How is an absent entailment like a test failure?" ;
  schema:acceptedAnswer :a7 .

:a7 a schema:Answer ;
  schema:text "If you state axioms and expect the reasoner to derive a conclusion, and it does not, that gap reveals a logic error in your model — a missing axiom, wrong domain/range, or incorrect subclass chain. Leaving it undetected until production is the ontological equivalent of a failing unit test discovered by a customer." .

:q8 a schema:Question ;
  schema:name "What is the difference between an ontology and a database schema?" ;
  schema:acceptedAnswer :a8 .

:a8 a schema:Answer ;
  schema:text "A database schema defines storage structure and constraints for rows. An ontology declares what kinds of things exist, how they relate, and what cannot both be true — it is formal logic, expressible as axioms, that admits automated reasoning. Ontology is code for meaning; a schema is code for storage." .

:q9 a schema:Question ;
  schema:name "Can large highly regular ontologies still use table-driven curation?" ;
  schema:acceptedAnswer :a9 .

:a9 a schema:Answer ;
  schema:text "For ontologies with >10K highly regular entities (anatomy, biological traits, chemistry), it is sometimes acceptable to curate in a table and map each row to a design pattern using a script. The key is that the mapping generates compilable Turtle and the result is still governed as code — not that the table is the final artefact." .

:q10 a schema:Question ;
  schema:name "What is the 'CSS on your marketing site' analogy?" ;
  schema:acceptedAnswer :a10 .

:a10 a schema:Answer ;
  schema:text "Tony Seale observes that the artefact deciding what an organisation means by a customer, an order, or a risk should not be governed less rigorously than the styling on the company website. CSS has branches, PRs, and CI; the core ontology often does not — and that imbalance is indefensible." .

:q11 a schema:Question ;
  schema:name "What RDF serialisation is best for treating ontologies as code?" ;
  schema:acceptedAnswer :a11 .

:a11 a schema:Answer ;
  schema:text "RDF Turtle is the most recommended for ontology-as-code workflows because it is human-readable, diff-friendly, and plays well with SDLC tools. OWL/Manchester Syntax is an alternative for heavily axiom-rich models. JSON-LD can be used when JSON toolchain integration is a priority." .

:q12 a schema:Question ;
  schema:name "What does 'your ontology is source code for your meaning' imply?" ;
  schema:acceptedAnswer :a12 .

:a12 a schema:Answer ;
  schema:text "It implies the ontology is the primary authoritative specification of what concepts mean in an organisation — not documentation, not a data dictionary, but executable, versioned, tested code that drives downstream systems. Treating it as anything less degrades organisational knowledge quality over time." .

## ── Glossary ──────────────────────────────────────────────────────

:glossarySection a schema:DefinedTermSet ;
  schema:name "Ontology Engineering Glossary" ;
  schema:hasDefinedTerm :termOntology, :termAxiom, :termEntailment, :termSatisfiability, :termVersionControl, :termOWL, :termRDFTurtle, :termReasoner, :termPullRequest, :termFormalLogic ;
  schema:isPartOf :post .

:post schema:hasPart :glossarySection .

:termOntology a schema:DefinedTerm ;
  schema:name "Ontology" ;
  schema:description "A formal specification of the concepts within a domain, the relationships among them, and the constraints that cannot simultaneously hold — expressed as axioms amenable to automated reasoning." ;
  owl:sameAs <http://dbpedia.org/resource/Ontology_(information_science)> .

:termAxiom a schema:DefinedTerm ;
  schema:name "Axiom" ;
  schema:description "A formal logical statement that asserts a fact or constraint about the domain model — for example, that every Person has exactly one birthdate, or that Manager is a subclass of Employee." .

:termEntailment a schema:DefinedTerm ;
  schema:name "Entailment" ;
  schema:description "A conclusion that logically follows from a set of axioms. If the expected entailment is absent from reasoner output, the axiom set has a gap — treated as a test failure in ontology-as-code practice." .

:termSatisfiability a schema:DefinedTerm ;
  schema:name "Satisfiability" ;
  schema:description "A class is satisfiable if it could have at least one instance given the axioms. An unsatisfiable class — one the reasoner can prove cannot exist — indicates contradictory axioms and should break the ontology build." .

:termVersionControl a schema:DefinedTerm ;
  schema:name "Version Control" ;
  schema:description "A system (typically Git) for tracking changes to files over time, enabling branches, diffs, blame, and pull requests — the foundation of software engineering discipline that ontologies should adopt." ;
  owl:sameAs <http://dbpedia.org/resource/Version_control> .

:termOWL a schema:DefinedTerm ;
  schema:name "OWL (Web Ontology Language)" ;
  schema:description "The W3C standard language for authoring ontologies, built on Description Logic. Supports rich axiom expressivity and decidable automated reasoning. OWL/Turtle serialisation combines OWL expressivity with Turtle readability." ;
  owl:sameAs <http://dbpedia.org/resource/Web_Ontology_Language> .

:termRDFTurtle a schema:DefinedTerm ;
  schema:name "RDF Turtle" ;
  schema:description "A compact, human-readable plain-text serialisation of RDF triples. Diff-friendly, well-supported by LLMs, and compatible with standard SDLC tooling — the recommended notation for ontology-as-code workflows." ;
  owl:sameAs <http://dbpedia.org/resource/Turtle_(syntax)> .

:termReasoner a schema:DefinedTerm ;
  schema:name "Reasoner" ;
  schema:description "Software (e.g., HermiT, Pellet, ELK) that applies Description Logic rules to an ontology to derive implicit facts, check satisfiability, and compute class hierarchies. Acts as the 'compiler' in ontology-as-code pipelines." .

:termPullRequest a schema:DefinedTerm ;
  schema:name "Pull Request" ;
  schema:description "A mechanism in Git-based workflows for proposing, reviewing, discussing, and merging changes — bringing peer review and change traceability to ontology development exactly as for application code." ;
  owl:sameAs <http://dbpedia.org/resource/Pull_request> .

:termFormalLogic a schema:DefinedTerm ;
  schema:name "Formal Logic" ;
  schema:description "A precise system of rules for deriving valid conclusions from stated premises. OWL ontologies are grounded in Description Logic, a decidable fragment of first-order logic, making automated reasoning tractable." ;
  owl:sameAs <http://dbpedia.org/resource/Formal_system> .

## ── HowTo ─────────────────────────────────────────────────────────

:howtoSection a schema:HowTo ;
  schema:name "How to Treat Your Ontology as Source Code" ;
  schema:description "A seven-step guide to adopting ontology-as-code practice within an engineering organisation." ;
  schema:step :step1, :step2, :step3, :step4, :step5, :step6, :step7 ;
  schema:isPartOf :post .

:post schema:hasPart :howtoSection .

:step1 a schema:HowToStep ;
  schema:position 1 ;
  schema:name "Choose a Plain-Text RDF Notation" ;
  schema:text "Select RDF Turtle (.ttl) or OWL/Manchester Syntax as your canonical format. Both are human-readable, diff-friendly, and well-supported by LLMs. Avoid formats that require round-tripping through a GUI tool before edits can be committed." .

:step2 a schema:HowToStep ;
  schema:position 2 ;
  schema:name "Initialise a Git Repository for the Ontology" ;
  schema:text "Create a dedicated Git repository (or a sub-directory in an existing monorepo) containing only ontology source files. Commit the initial TTL, add a .gitignore for reasoner cache artefacts, and push to a shared remote." .

:step3 a schema:HowToStep ;
  schema:position 3 ;
  schema:name "Add a CI Pipeline with Reasoner Validation" ;
  schema:text "Configure a CI workflow (GitHub Actions, GitLab CI, or equivalent) that runs on every commit: validate Turtle syntax (rapper or rdflib), run a reasoner (HermiT or ELK) to check satisfiability, and assert that all expected entailments are present. Fail the build on any violation." .

:step4 a schema:HowToStep ;
  schema:position 4 ;
  schema:name "Define a Branching Strategy" ;
  schema:text "Adopt a branching convention: main for released versions, feature branches for new terms or axioms, and a release branch for each published version. Protect main with required CI passes and at least one reviewer approval before merge." .

:step5 a schema:HowToStep ;
  schema:position 5 ;
  schema:name "Establish a Pull Request and Review Process" ;
  schema:text "Require pull requests for all changes to the ontology. Reviewers check logical correctness, naming conventions, documentation completeness, and test coverage. Use PR templates to prompt authors for motivation, examples, and downstream impact." .

:step6 a schema:HowToStep ;
  schema:position 6 ;
  schema:name "Integrate LLM Tooling for Assisted Authoring" ;
  schema:text "Give your LLM (Claude, GPT, Gemini) direct read/write access to ontology source files — not just an API or MCP wrapper. The LLM can propose new terms, spot duplicate concepts, generate documentation, and draft axioms, all within the same file-edit workflow used for application code." .

:step7 a schema:HowToStep ;
  schema:position 7 ;
  schema:name "Define a Release and Semantic Versioning Policy" ;
  schema:text "Tag releases using semantic versioning (MAJOR.MINOR.PATCH). A MAJOR bump signals a breaking change (removed terms, incompatible axioms). MINOR adds terms backwards-compatibly. PATCH fixes documentation or non-breaking axiom corrections. Publish a CHANGELOG with each release." .

## ── Provenance ────────────────────────────────────────────────────

:kgGeneratorSkill a schema:SoftwareApplication ;
  schema:name "kg-generator skill" ;
  schema:url "https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator"^^xsd:anyURI ;
  schema:description "OpenLink AI Agent Skill for generating comprehensive RDF knowledge graphs from web content." .

:rdfInfographicSkill a schema:SoftwareApplication ;
  schema:name "rdf-infographic-skill" ;
  schema:url "https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/rdf-infographic-skill"^^xsd:anyURI ;
  schema:description "OpenLink AI Agent Skill for generating interactive HTML infographics and Markdown companions from RDF knowledge graphs." .

## ── Compliance Self-Audit ─────────────────────────────────────────
## PASS  01: schema: uses http://schema.org/ (not https)
## PASS  02: Custom ontology declared with owl:Ontology, schema:name, schema:description, schema:identifier
## PASS  03: 3 custom classes, 3 custom properties, all with rdfs:isDefinedBy :
## PASS  04: schema:FAQPage :faqSection with exactly 12 Questions/Answers (q1-q12, a1-a12)
## PASS  05: schema:DefinedTermSet :glossarySection with exactly 10 terms
## PASS  06: schema:HowTo :howtoSection with exactly 7 steps (step1-step7)
## PASS  07: :post schema:hasPart :principlesSection, :commentatorsSection, :faqSection, :glossarySection, :howtoSection
## PASS  08: All DBpedia IRIs fully expanded (http://dbpedia.org/resource/...)
## PASS  09: No file: scheme IRIs anywhere
## PASS  10: owl:sameAs used for DBpedia cross-references (not schema:sameAs)
## PASS  11: @prefix : is the canonical https: source URL with # suffix
## PASS  12: No blank nodes for schema:Answer — all named :a1–:a12
## PASS  13: prov:wasGeneratedBy links :post to :kgGeneratorSkill
## PASS  14: 4 schema:SoftwareSourceCode SPARQL query examples with correct named graph IRI
## SCORE: 14/14 PASS
