@prefix this: . @prefix sub: . @prefix np: . @prefix grlc: . @prefix dct: . @prefix nt: . @prefix npx: . @prefix xsd: . @prefix rdfs: . @prefix orcid: . @prefix prov: . @prefix foaf: . sub:Head { this: a np:Nanopublication; np:hasAssertion sub:assertion; np:hasProvenance sub:provenance; np:hasPublicationInfo sub:pubinfo . } sub:assertion { sub:get-space-rfips a grlc:grlc-query; dct:description "Returns the reference FAIR Implementation Profiles (rFIPs) of a space, one row per community: the rFIP nanopublication with the newest dct:created among those declared by that community, restricted to the FAIR communities of the given space and of its sub-spaces. The space-scoped counterpart of the \"Get reference FIPs (latest version per community)\" query, with the same columns. Successive versions of an rFIP are not reliably chained by npx:supersedes -- the FIP wizard supersedes some earlier nanopublication rather than the preceding rFIP -- so filtering on invalidation alone leaves several versions of the same profile in the listing (three for PARC Toxicology). The community given by fip:declared-by is used as the identity of the profile, since each version re-introduces the rFIP under a new IRI and therefore cannot be grouped by it. Three steps lead from the space to the communities: Nanodash fills the multi placeholder with the space IRI and the alt IDs of its root definition (its owl:sameAs objects, which for a space that is also a FAIR community is the community IRI the rFIPs point at); gen:isSubSpaceOf adds the sub-spaces, taken from non-invalidated nanopublications and followed transitively, so nested sub-spaces count too; and owl:sameAs in a non-invalidated nanopublication that introduces or describes a space in scope maps each of them to its FAIR community, in either direction. The sub-space links are read from the plain nanopublication graphs rather than from the materialised space state of the spaces repository, which the rFIP data is not in: any non-invalidated sub-space declaration counts, without the admin-side authority check that the spaces repository applies. The scope is resolved inside the per-community sub-select, so the newest version is only computed for the communities in scope; running against the full repository rather than the rFIP type repository is what makes the space definitions reachable in the first place."; dct:license ; rdfs:label "Get the reference FIPs (rFIPs) of a space"; grlc:endpoint ; grlc:sparql """prefix rdf: prefix rdfs: prefix np: prefix npa: prefix npx: prefix xsd: prefix dct: prefix owl: prefix foaf: prefix prov: prefix skos: prefix schema: prefix gen: prefix fip: prefix tpff: prefix search: select (?rfip as ?rFIP) (?rfip_label as ?rFIP_label) ?version ?community ?np (\"^\" as ?np_label) where { { select ?community (max(?date) as ?latest) where { { select distinct ?community where { { select distinct ?scope where { { values ?_space_multi_iri {} bind(?_space_multi_iri as ?scope) } union { values ?_space_multi_iri {} graph npa:graph { ?sub_np np:hasAssertion ?sub_a ; npa:hasValidSignatureForPublicKey ?sub_pk . filter not exists { ?sub_x npx:invalidates ?sub_np ; npa:hasValidSignatureForPublicKey ?sub_pk . } } graph ?sub_a { ?scope gen:isSubSpaceOf ?parent . } ?parent gen:isSubSpaceOf* ?_space_multi_iri . } } } ?scope (owl:sameAs|^owl:sameAs)? ?community . filter(?community = ?scope || exists { graph npa:graph { ?same_np npx:introduces|npx:describes ?scope ; np:hasAssertion ?same_a ; npa:hasValidSignatureForPublicKey ?same_pk . filter not exists { ?same_x npx:invalidates ?same_np ; npa:hasValidSignatureForPublicKey ?same_pk . } } graph ?same_a { { ?scope owl:sameAs ?community } union { ?community owl:sameAs ?scope } } }) } } graph npa:graph { ?cnp npx:hasNanopubType fip:Reference-FAIR-Implementation-Profile ; npa:hasValidSignatureForPublicKeyHash ?cpubkey ; dct:created ?date ; np:hasAssertion ?ca ; npx:introduces ?crfip . filter not exists { ?cnpx npx:invalidates ?cnp ; npa:hasValidSignatureForPublicKeyHash ?cpubkey . } } graph ?ca { ?crfip fip:declared-by ?community . } } group by ?community } graph npa:graph { ?np npx:hasNanopubType fip:Reference-FAIR-Implementation-Profile ; npa:hasValidSignatureForPublicKeyHash ?pubkey ; dct:created ?latest ; np:hasAssertion ?a ; npx:introduces ?rfip . filter not exists { ?npx npx:invalidates ?np ; npa:hasValidSignatureForPublicKeyHash ?pubkey . } } graph ?a { ?rfip a fip:Reference-FAIR-Implementation-Profile ; rdfs:label ?rfip_label ; fip:declared-by ?community . optional { ?rfip schema:version ?version . } } } """ . } 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-10-12T10:53:10Z"^^xsd:dateTime; dct:creator ; dct:license ; npx:embeds sub:get-space-rfips; rdfs:label "Get the reference FIPs (rFIPs) of a space"; nt:wasCreatedFromProvenanceTemplate ; nt:wasCreatedFromPubinfoTemplate , ; nt:wasCreatedFromTemplate . sub:sig npx:hasAlgorithm "RSA"; npx:hasPublicKey "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzZAkv4Mu1YSUxQMriBnhYunqosX5wpuQ3FjUyzW8wTC51wjCmhsChyhS+mCx7Od+2MTDpdhxDWA+pH1r9AX508X2rIY/sbpMS+pd56e0qKPQ0t4folln1TgamPN9iOlY/yLc2x27AdipWIGXUdtL2iAcb+P/Y5dQS2AkHMS3lP2e5JBL5/bD/10qvTLKvdsqIKts8qjuLpxr9CFbsS2gLjMkXL5D2IsJ0cL5sgmIfS1inLVxIfXrS/OgqYNFqeNznUYCVWfo0g7DKjnjiICz3omeQeJFLYwlJ6PhUhYDQS6O318DGwUCwhnuXbBbwL9evZa2I/0Pwu5xpZdNLYJ5UwIDAQAB"; npx:hasSignature "I3EVot9chuOpnI68CsQM6anBJWRXp9OwUJPIoO20qYnmDkx6Hh/g/KtUj+obsbDKImqs/4cIntKNBCOyhQEn5a79ecKa5zOcYfgZgNACpMtWNQv6ElOeW5+f/FKofNG1hWfV+yUY7zUl2RABx6bNJ+JvfDVc4nq83E69U1RuRAzHYk7YU4F++LjJItPzF6eZUM2iMYDMcAxB5pz+F76VOX4oOX+i04a6w+vJVfDnt12/xP3lCcWzRbh8MLcVhqqrHImS3x4LCbUlH5Y2Pzeujm0RcSIxOmC0ce16PSZ8k/3PrmjPHNJd+e9eafJluv5VuzrifJVIVW0Jhsq5xSYHyg=="; npx:hasSignatureTarget this:; npx:signedBy . }