@prefix this: . @prefix sub: . @prefix schema: . @prefix gen: . @prefix np: . @prefix dct: . @prefix nt: . @prefix npx: . @prefix xsd: . @prefix rdfs: . @prefix prov: . sub:Head { this: a np:Nanopublication; np:hasAssertion sub:assertion; np:hasProvenance sub:provenance; np:hasPublicationInfo sub:pubinfo . } sub:assertion { sub:paragraph a gen:Paragraph; schema:about ; schema:title "Session-bound parameters"; gen:hasContent """

Three placeholder names are reserved and filled automatically from the browser session of whoever is looking at the view, with no form field shown: LOCALPUBKEY is the viewer's signing public key, CURRENTUSER their agent IRI, and SITEURL the address of the Nanodash instance. They let a view react to who is viewing it, for example by offering a \"retract\" action only on rows the viewer signed.

Declare them as optional multi-value placeholders, each with its own empty values block in every scope where it is used: ?__LOCALPUBKEY_multi, ?__CURRENTUSER_multi_iri, ?__SITEURL_multi.

A logged-out visitor has none of them, so the variable is simply unbound and every comparison must tolerate that. Wrap each one in coalesce, as in coalesce(str(?pubkey) = str(?__LOCALPUBKEY_multi), false), so the query still returns its rows instead of failing or dropping them.

"""; gen:hasPositionString "01.07" . } sub:provenance { sub:assertion prov:wasAttributedTo . } sub:pubinfo { this: dct:created "2026-09-09T14:46:50Z"^^xsd:dateTime; dct:creator ; dct:license ; npx:introduces sub:paragraph; rdfs:label "Session-bound parameters"; nt:wasCreatedFromProvenanceTemplate ; nt:wasCreatedFromPubinfoTemplate , ; nt:wasCreatedFromTemplate . sub:sig npx:hasAlgorithm "RSA"; npx:hasPublicKey "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl8cMusqtNyKA6UIsi3f7BAcZmHQXWxU0qk0PLsboMWQxYrGBfGgHTgRHJrBRxL+Zn9kJHKVmz2smDcjCBptXi/OwWy80gjsx+Pbe6IWz3zFPWF1UoFIKfPnC0slV67CQgdM853zW7Bmk9/uflCtK4EtZKmPdRGtUHVC7DTVvDBMDzLRGdE2KCBVN29EbM5GGVNvijYbaZQ9OFQPBkQshayqSIyGRr6rreJdkrRVLIzu3uuAjKYydaeXZWSN2JLnVBwrClKUxaEdCwhb5nXpMtKOMD+R+LgaXLeJUWM8BdRSYnta9ZqI5pHY4y3v+eW7J+HHeTvRbHvlik+Z4hFUXmQIDAQAB"; npx:hasSignature "iaOnibQ5OuQxBw2sKhgWvKPFoUrU1VWBoQdVvuOoDxXe05qndJRUIiPFoRK8NPO/SaHRDa1g2ZKSDYnI+8IyqO09ewm1Qqdt/kxM/KVudQhniCdXkV92JvgYq43T+mvY0MOgtNDvEAfOu2hCjGnpWc83RiLXBUrhuvYJwAID6YlJESVQGu/xbMJc/IjCPTvfEO76LZw20acmK4pCq2VSF4gvrvhrHWVsVO+Pz2tzuAaDtW0pQIcZWVHPjnpi2YkEFpNx2n2zhgpbGTvNh693DbO0gUhuW7w9HEltIGyC6sokpvm1059d037dGcgxG7pAvcRq9815Ne1OrKSZaiGWdA=="; npx:hasSignatureTarget this:; npx:signedBy . }