<https://docs.linkeddatahub.com/tutorial/model/#content>
        a       <https://w3id.org/atomgraph/linkeddatahub#XHTML>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#value>
                "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n    <p class=\"ldh-body-lg\">Define the vocabulary that describes your domain</p>\n    <p>Each dataspace has a <strong>namespace ontology</strong> where you define the classes and properties of your domain. It lives in the <em>admin</em> dataspace, which shares your base URI with\n        an <samp>admin.</samp> subdomain prefix: for the end-user app at <samp>https://localhost:4443/</samp>, the ontology document is\n        <samp>https://admin.localhost:4443/ontologies/namespace/</samp>.</p>\n    <p>Northwind reuses <a href=\"https://schema.org\" target=\"_blank\">Schema.org</a> terms rather than inventing its own, so modeling here means little more than declaring which classes the app\n        uses and how they are labeled:</p>\n    <pre>@prefix :       &lt;#&gt; .\n@prefix rdfs:   &lt;http://www.w3.org/2000/01/rdf-schema#&gt; .\n@prefix owl:    &lt;http://www.w3.org/2002/07/owl#&gt; .\n@prefix schema: &lt;https://schema.org/&gt; .\n\n: a owl:Ontology .\n\nschema:ProductGroup a owl:Class ;\n    rdfs:label \"Category\" ;\n    rdfs:isDefinedBy : .\n\nschema:Product a owl:Class ;\n    rdfs:label \"Product\" ;\n    rdfs:isDefinedBy : .\n\nschema:Order a owl:Class ;\n    rdfs:label \"Order\" ;\n    rdfs:isDefinedBy : .</pre>\n    <p class=\"exhibit-links\">Source (full model): <a href=\"https://github.com/AtomGraph/LinkedDataHub-Apps/blob/master/demo/northwind-traders/admin/model/ns.ttl\" target=\"_blank\">admin/model/ns.ttl</a></p>\n    <p>The finished model goes further than labels. It declares the domain's properties with their domains and ranges, a couple of <code>owl:Restriction</code>s,\n        and a <a href=\"../../user-guide/change-model/\" target=\"_blank\">constructor</a> that drives the Product create form.</p>\n    <p>It also attaches views directly to properties with <code>ldh:inverseView</code>. That is why every customer page shows its orders and every supplier page its\n        products, with no per-page configuration.</p>\n    <div class=\"ac-tabs or-horizontal\">\n        <div class=\"ac-tablist sz-md va-line\" role=\"tablist\">\n            <button aria-controls=\"in-the-browser-pane\" aria-selected=\"true\" class=\"ac-tab is-on\" id=\"in-the-browser-tab\" role=\"tab\" type=\"button\"><span class=\"ac-tab-lbl\">In the browser</span></button>\n            <button aria-controls=\"from-the-command-line-pane\" aria-selected=\"false\" class=\"ac-tab\" id=\"from-the-command-line-tab\" role=\"tab\" type=\"button\"><span class=\"ac-tab-lbl\">From the command line</span></button>\n        </div>\n        <div aria-labelledby=\"in-the-browser-tab\" class=\"ac-tabpanel\" id=\"in-the-browser-pane\" role=\"tabpanel\">\n        <p>Open the admin dataspace and edit the namespace ontology document directly, or follow the <a href=\"../../user-guide/change-model/\" target=\"_blank\">Change model</a> guide, which also\n            shows how to add SPIN constructors to classes — the templates that drive the create-instance forms in the UI.</p>\n        </div>\n        <div aria-labelledby=\"from-the-command-line-tab\" class=\"ac-tabpanel\" hidden=\"hidden\" id=\"from-the-command-line-pane\" role=\"tabpanel\">\n        <p>Append the class definitions from <samp>ns.ttl</samp> to the namespace ontology document with <code>POST</code>. The prepended <code>@base</code> makes the <code>:</code> prefix resolve to\n            <samp>${LDH_BASE}ns#</samp> — the terms belong to the end-user namespace even though the ontology document lives in the admin app:</p>\n        <pre>admin_base=\"https://admin.localhost:4443/\"   # $LDH_BASE with the admin. subdomain prefix\n\n{ echo \"@base &lt;${LDH_BASE}ns&gt; .\"; cat ns.ttl; } | ldh post \\\n    -t text/turtle \\\n    \"${admin_base}ontologies/namespace/\"</pre>\n        <p>The ontology is cached in memory, so tell the dataspace to reload it:</p>\n        <pre>ldh admin clear ontology \\\n    -b \"$admin_base\" \\\n    --ontology \"${LDH_BASE}ns#\"</pre>\n        </div>\n    </div>\n    <div>\n        <h2 id=\"result\">What you now see</h2>\n        <p>The ontology document in the admin app now renders your classes with their labels. The visible payoff on the end-user side comes in the next stage: resources imported as\n            <code>schema:Product</code> or <code>schema:Order</code> arrive typed and labeled, and the model is what the UI uses to render and create them.</p>\n    </div>\n    <div>\n        <h2 id=\"how-this-works\">How this works</h2>\n        <ul>\n            <li><a href=\"../../reference/administration/ontologies/\" target=\"_blank\">Ontologies</a> — namespace ontologies, imports and caching</li>\n            <li><a href=\"../../user-guide/change-model/\" target=\"_blank\">Change model</a> — classes, constructors and constraints from the UI</li>\n        </ul>\n    </div>\n    <p class=\"ldh-body-lg\">Next: <a href=\"../data/\">Data</a></p>\n</div>"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .

<https://docs.linkeddatahub.com/tutorial/model/>
        a       <https://w3id.org/atomgraph/linkeddatahub/document-hierarchy#Item>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1>
                <https://docs.linkeddatahub.com/tutorial/model/#content>;
        <http://purl.org/dc/terms/created>
                "2026-09-29T09:52:44.389Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
        <http://purl.org/dc/terms/creator>
                <https://admin.linkeddatahub.com/acl/agents/5ba81960-d511-4a3b-8b9a-cb5bb278dd95/#this>;
        <http://purl.org/dc/terms/description>
                "Define the vocabulary that describes your domain";
        <http://purl.org/dc/terms/title>
                "Model";
        <http://rdfs.org/sioc/ns#has_container>
                <https://docs.linkeddatahub.com/tutorial/>;
        <http://www.w3.org/ns/auth/acl#owner>
                <https://admin.linkeddatahub.com/acl/agents/5ba81960-d511-4a3b-8b9a-cb5bb278dd95/#this> .
