Nanopublication

< Home

ID

https://w3id.org/np/RAUj8_Og_Ruj56tq4nlfo035q-HSvHBPC-UENDFlF3M8Q

Formats

.trig | .trig.txt | .jelly | .jelly.txt | .jsonld | .jsonld.txt | .nq | .nq.txt | .xml | .xml.txt

Content

@prefix this: <https://w3id.org/np/RAUj8_Og_Ruj56tq4nlfo035q-HSvHBPC-UENDFlF3M8Q> .
@prefix sub: <https://w3id.org/np/RAUj8_Og_Ruj56tq4nlfo035q-HSvHBPC-UENDFlF3M8Q/> .
@prefix np: <http://www.nanopub.org/nschema#> .
@prefix grlc: <https://w3id.org/kpxl/grlc/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix nt: <https://w3id.org/np/o/ntemplate/> .
@prefix npx: <http://purl.org/nanopub/x/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix orcid: <https://orcid.org/> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

sub:Head {
  this: a np:Nanopublication;
    np:hasAssertion sub:assertion;
    np:hasProvenance sub:provenance;
    np:hasPublicationInfo sub:pubinfo .
}

sub:assertion {
  sub:get-event-participation-actions a grlc:grlc-query;
    dct:description "Backs a call-to-action panel on an event Space, inviting the visitor to declare how they take part. Returns one row per way in that is still open to this particular viewer: taking part (planned attendance before the event's start date, actual participation from the start date onwards) and observing. Observing is offered only to a viewer who has declared neither attendance nor participation - somebody who is coming is not also an observer. A row is returned only when the space actually offers that way in - that is, when a role carrying the corresponding property is attached to the space - and only when the viewer has not already declared it, read from the viewer's validated role instantiations via the CURRENTUSER session parameter. A logged-out visitor has no role instantiations, so they are offered everything the space offers. When nothing is left to offer, a single row with empty content is returned instead of no rows at all, so the panel renders blank rather than showing \"(nothing found)\". The content column holds ready-made root-relative /publish links with template-version=latest, which Nanodash renders as buttons; no title column is returned, so the rows carry no headings of their own and the panel's own title does the labelling.";
    dct:license <http://www.apache.org/licenses/LICENSE-2.0>;
    rdfs:label "Get the ways in still open to the viewer of an event";
    grlc:endpoint <https://w3id.org/np/l/nanopub-query-1.1/repo/spaces>;
    grlc:sparql """prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix np: <http://www.nanopub.org/nschema#>
prefix npa: <http://purl.org/nanopub/admin/>
prefix npx: <http://purl.org/nanopub/x/>
prefix gen: <https://w3id.org/kpxl/gen/terms/>
prefix wd: <http://www.wikidata.org/entity/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

select ?content where {
  values ?_space_multi_iri {}
  values ?__CURRENTUSER_multi_iri {}

  graph npa:graph { npa:thisRepo npa:hasCurrentSpaceState ?state . }

  # Has the event started? Read the start date off the space's current definition.
  optional {
    graph npa:graph {
      ?defNp npa:hasValidSignatureForPublicKeyHash ?defKey ;
             np:hasAssertion ?defA ;
             npx:introduces ?_space_multi_iri .
      filter not exists { ?defInv npx:invalidates ?defNp ; npa:hasValidSignatureForPublicKeyHash ?defKey . }
      filter not exists { ?defNewer npx:supersedes ?defNp . }
    }
    graph ?defA { ?_space_multi_iri <http://schema.org/startDate> ?startRaw . }
  }
  bind(coalesce(?startRaw, '9999-12-31T00:00:00Z'^^xsd:dateTime) as ?start)
  bind(now() >= ?start as ?started)

  # Which of the three ways in does this space actually offer? A role only takes
  # effect once it is attached to the space, so an unattached one is not offered.
  bind(exists {
    graph npa:graph { ?an1 npa:hasValidSignatureForPublicKeyHash ?ak1 ; np:hasAssertion ?aa1 .
      filter not exists { ?ai1 npx:invalidates ?an1 ; npa:hasValidSignatureForPublicKeyHash ?ak1 . } }
    graph ?aa1 { ?_space_multi_iri gen:hasRole ?role1 . }
    graph ?rd1 { ?role1 gen:hasRegularProperty gen:plansToAttend . }
  } as ?offersPlanned)
  bind(exists {
    graph npa:graph { ?an2 npa:hasValidSignatureForPublicKeyHash ?ak2 ; np:hasAssertion ?aa2 .
      filter not exists { ?ai2 npx:invalidates ?an2 ; npa:hasValidSignatureForPublicKeyHash ?ak2 . } }
    graph ?aa2 { ?_space_multi_iri gen:hasRole ?role2 . }
    graph ?rd2 { ?role2 gen:hasRegularProperty wd:P1344 . }
  } as ?offersParticipation)
  bind(exists {
    graph npa:graph { ?an3 npa:hasValidSignatureForPublicKeyHash ?ak3 ; np:hasAssertion ?aa3 .
      filter not exists { ?ai3 npx:invalidates ?an3 ; npa:hasValidSignatureForPublicKeyHash ?ak3 . } }
    graph ?aa3 { ?_space_multi_iri gen:hasRole ?role3 . }
    graph ?rd3 { ?role3 gen:hasInverseProperty gen:hasObserver . }
  } as ?offersObserver)

  # Which has the viewer already declared? With no viewer (logged out) the str()
  # comparison errors, the filter drops the row, and exists() is false - so a
  # logged-out visitor is offered everything the space offers.
  bind(exists {
    graph ?state { ?ri1 a gen:RoleInstantiation ; npa:forSpace ?_space_multi_iri ;
        npa:forAgent ?u1 ; npa:regularProperty gen:plansToAttend . }
    filter(str(?u1) = str(?__CURRENTUSER_multi_iri))
  } as ?hasPlanned)
  bind(exists {
    graph ?state { ?ri2 a gen:RoleInstantiation ; npa:forSpace ?_space_multi_iri ;
        npa:forAgent ?u2 ; npa:regularProperty wd:P1344 . }
    filter(str(?u2) = str(?__CURRENTUSER_multi_iri))
  } as ?hasParticipated)
  bind(exists {
    graph ?state { ?ri3 a gen:RoleInstantiation ; npa:forSpace ?_space_multi_iri ;
        npa:forAgent ?u3 ; npa:inverseProperty gen:hasObserver . }
    filter(str(?u3) = str(?__CURRENTUSER_multi_iri))
  } as ?hasObserver)

  # One row per way in that is still open, plus a silent row so that a viewer who
  # has declared everything gets a blank panel rather than \"(nothing found)\".
  values (?slot ?sort) { ('take-part' 1) ('observe' 2) ('none' 3) }
  bind(if(?started, ?offersParticipation, ?offersPlanned) as ?takePartOffered)
  bind(if(?started, ?hasParticipated, ?hasPlanned) as ?takePartDone)
  bind(?takePartOffered && !?takePartDone as ?showTakePart)
  bind(?offersObserver && !?hasObserver && !?hasPlanned && !?hasParticipated as ?showObserve)
  filter(if(?slot = 'take-part', ?showTakePart,
         if(?slot = 'observe', ?showObserve,
            !?showTakePart && !?showObserve)))

  bind(concat('/publish?template-version=latest&param_space=',
              encode_for_uri(str(?_space_multi_iri)), '&template=') as ?tail)
  bind(if(?slot = 'take-part',
        if(?started,
          concat('<p>This event is under way. Put it on record that you are taking part — one nanopublication, retractable at any time.</p><p><a href=\"', ?tail,
                 encode_for_uri('https://w3id.org/np/RAAcUy5wBwXNyadgD71k1rP0iM_KFc07qXFyrxhPcKS5M'),
                 '\">declare participation...</a></p>'),
          concat('<p>Planning to come? Saying so puts you on the list of expected participants — one nanopublication, retractable at any time.</p><p><a href=\"', ?tail,
                 encode_for_uri('https://w3id.org/np/RAQ1LrU5fyY0Szd-4i9nN_JXBMvKti_v-GeHZgQG-EpzI'),
                 '\">declare planned attendance...</a></p>')),
      if(?slot = 'observe',
          concat('<p>Not coming, but want to follow what happens here?</p><p><a href=\"', ?tail,
                 encode_for_uri('https://w3id.org/np/RAs3LMTf4JLXDUGCi1MjT2448aJQE3aatSgkapNwgdgHY'),
                 '\">observe...</a></p>'),
          '')) as ?content)
}
order by ?sort""" .
}

sub:provenance {
  sub:assertion prov:wasAttributedTo orcid:0000-0002-1267-0234 .
}

sub:pubinfo {
  orcid:0000-0002-1267-0234 foaf:name "Tobias Kuhn" .
  
  this: dct:created "2026-09-07T08:53:21Z"^^xsd:dateTime;
    dct:creator orcid:0000-0002-1267-0234;
    dct:license <https://creativecommons.org/licenses/by/4.0/>;
    npx:embeds sub:get-event-participation-actions;
    npx:supersedes <https://w3id.org/np/RAnF7Dc2XfVY2gs2f4-WsjT20neMzDchON5ONmrUN8pzc>;
    rdfs:label "Get the ways in still open to the viewer of an event";
    nt:wasCreatedFromProvenanceTemplate <https://w3id.org/np/RA7lSq6MuK_TIC6JMSHvLtee3lpLoZDOqLJCLXevnrPoU>;
    nt:wasCreatedFromPubinfoTemplate <https://w3id.org/np/RA-N4_kFxcruvBTlo1yJv29E4SLOXsx5KO_th69PprMrA>,
      <https://w3id.org/np/RACJ58Gvyn91LqCKIO9zu1eijDQIeEff28iyDrJgjSJF8>, <https://w3id.org/np/RARJj78P72NR5edKOnu_f4ePE9NYYuW2m2pM-fEoobMBk>,
      <https://w3id.org/np/RAoTD7udB2KtUuOuAe74tJi1t3VzK0DyWS7rYVAq1GRvw>;
    nt:wasCreatedFromTemplate <https://w3id.org/np/RAEFAt-QcFK0ZhqfvlsmS10BnzGJA0xwOICZXkO-ai87k> .
  
  sub:sig npx:hasAlgorithm "RSA";
    npx:hasPublicKey "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwUtewGCpT5vIfXYE1bmf/Uqu1ojqnWdYxv+ySO80ul8Gu7m8KoyPAwuvaPj0lvPtHrg000qMmkxzKhYknEjq8v7EerxZNYp5B3/3+5ZpuWOYAs78UnQVjbHSmDdmryr4D4VvvNIiUmd0yxci47dTFUj4DvfHnGd6hVe5+goqdcwIDAQAB";
    npx:hasSignature "coIzSXaw/gkpvJaS3Id/AP7yo4BXNe1MddovJGKYlwXidH4fvAbfVi7ZVG++B6yWo4di4FQVbtwvx0L4PUpyr1sLe8JdeOREFBxLQFpXKXPwmStFsM7MALdSZ4Ir4qsISindoz1EfuSzOYob7Zs9Tvdv4QApMjXzH1puZ1bsqbI=";
    npx:hasSignatureTarget this:;
    npx:signedBy orcid:0000-0002-1267-0234 .
}