<https://docs.linkeddatahub.com/tutorial/media/#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\">Upload files and link them to resources</p>\n    <p>Northwind comes with images: a photo per employee, an icon per category. Uploaded files are stored <strong>content-addressed</strong> — the file's URL is derived from the SHA-1 hash of its\n        content, under <samp>{base}uploads/</samp>. The same bytes always land at the same URL, which is what makes file references stable enough to bake into import mappings.</p>\n    <div>\n        <h2 id=\"linking\">Linking files to resources</h2>\n        <p>A file becomes part of the graph the moment something points at it. The category mapping from the <a href=\"../data/\">Data</a> stage does exactly that — the CSV carries each image's hash\n            in its <samp>pictureHash</samp> column, and the mapping mints the upload URL from it:</p>\n        <pre>?category foaf:depiction ?picture .\n...\nBIND(uri(concat(str($base), \"uploads/\", encode_for_uri(?pictureHash))) AS ?picture)</pre>\n        <p class=\"exhibit-links\">Source: <a href=\"https://github.com/AtomGraph/LinkedDataHub-Apps/blob/master/demo/northwind-traders/categories/categories.rq\" target=\"_blank\">categories/categories.rq</a></p>\n        <p>The employee mapping does the same with a <samp>photoHash</samp> column, linking the portrait with <code>foaf:img</code>, the predicate for an image <em>of</em> a person, while\n            <code>foaf:depiction</code> is the looser <em>depicts</em> relation used for the category art.</p>\n    </div>\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>Click the <span class=\"ac-btn in-primary ap-solid sz-md\">Create</span> dropdown at the bottom of the page and select <samp>File</samp>. Choose the file, give it a title, and save. The\n            <a href=\"../../user-guide/upload-file/\" target=\"_blank\">Upload file</a> guide walks through the form in detail.</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        <pre>ldh add file \\\n    --title \"Nancy Davolio\" \\\n    --file employees/nancy.jpg \\\n    --content-type \"image/jpeg\" \\\n    \"$LDH_BASE\"</pre>\n        <p><samp>ldh add file</samp> prints the content-addressed URL of the upload (<samp>{base}uploads/{sha1}</samp>) as its only output, so it can be captured into a variable and referenced from imports or content.\n            <code>--content-type</code> is optional — the media type is detected from the file when it is omitted.</p>\n        </div>\n    </div>\n    <div>\n        <h2 id=\"result\">What you now see</h2>\n        <p>Category and employee documents now render with their images — <code>foaf:depiction</code> and <code>foaf:img</code> are picked up by the default layout, no template work required.</p>\n        <img alt=\"An employee document with the photo rendered\" src=\"/uploads/0909e7478dad2b48bc095f3f45e2827aa0537caa\"></img>\n    </div>\n    <div>\n        <h2 id=\"how-this-works\">How this works</h2>\n        <ul>\n            <li><a href=\"../../reference/dataset/#hierarchical-uris\" target=\"_blank\">Hierarchical URIs</a> — the content-addressed <samp>uploads/{sha1sum}</samp> namespace in the dataset structure</li>\n            <li><a href=\"../../user-guide/upload-file/\" target=\"_blank\">Upload file</a> — the upload form and the CLI command, step by step</li>\n        </ul>\n    </div>\n    <p class=\"ldh-body-lg\">Next: <a href=\"../insight/\">Insight</a></p>\n</div>"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .

<https://docs.linkeddatahub.com/tutorial/media/>
        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/media/#content>;
        <http://purl.org/dc/terms/created>
                "2026-09-29T09:52:43.849Z"^^<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>
                "Upload files and link them to resources";
        <http://purl.org/dc/terms/title>
                "Media";
        <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> .
