@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:fip-search a grlc:grlc-query; dct:description "Full-text search over FAIR Implementation Profiles (FIPs): matches the query against the FIP nanopublications (label, description and other literals), and returns the FIP, its declaring community (name only), version, date, a checkmark when the nanopublication is curated by the GO FAIR Foundation, and the match score. Reference FIPs are included. Example, invalidated and superseded nanopublications are excluded. FIP nanopublications that a GO FAIR Foundation curator has disapproved of (npx:disapprovesOf, signed with a key from the curators list and not invalidated) are left out, as in the FIPs list and the FIP Wizard lookup."; dct:license ; rdfs:label "FIP search"; 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 ?fip (min(?fip_label) as ?fip_label) (min(?community) as ?community) (min(?community_label) as ?community_label) (min(?version) as ?version) (min(?date) as ?date) (max(?curated_x) as ?curated) (max(?score) as ?score) (min(?np) as ?np) (\"^\" as ?np_label) where { { select ?np ?fip_label ?date (max(?score_x) as ?score) where { graph npa:graph { ?np npx:hasNanopubType fip:FAIR-Implementation-Profile ; rdfs:label ?fip_label ; npa:hasValidSignatureForPublicKey ?pk ; dct:created ?date . filter not exists { ?np npx:hasNanopubType npx:ExampleNanopub . } filter not exists { ?x npx:invalidates ?np ; npa:hasValidSignatureForPublicKey ?pk . } } ?np search:matches [ search:query ?_query ; search:property npa:hasFilterLiteral ; search:score ?score_x ] . # Curator disapprovals, from the npx:disapprovesOf type repo (repo/text has no assertion graphs), before the top-50 cut. minus { service { select distinct ?np where { graph npa:graph { npa:hasValidSignatureForPublicKey ?curators_pk . ?curators_np npa:hasValidSignatureForPublicKey ?curators_pk ; np:hasAssertion ?curators_a . filter not exists { ?curators_x npx:invalidates ?curators_np ; npa:hasValidSignatureForPublicKey ?curators_pk . } } graph npa:networkGraph { ?curators_np (npx:supersedes)* . filter not exists { ?curators_y npx:supersedes ?curators_np } } graph ?da { ?disapprover npx:disapprovesOf ?np . } graph npa:graph { ?dnp np:hasAssertion ?da ; npa:hasValidSignatureForPublicKey ?dpk . filter not exists { ?dx npx:invalidates ?dnp ; npa:hasValidSignatureForPublicKey ?dpk . } } graph ?curators_a { ?dk npx:hasPublicKey ?dpk . } } } } } group by ?np ?fip_label ?date order by desc(?score) limit 50 } service { graph npa:graph { ?np np:hasAssertion ?a ; npx:introduces ?fip . } graph ?a { ?fip fip:declared-by ?community . optional { ?fip schema:version| ?version . } } } optional { service { graph npa:graph { ?cnp npx:introduces|npx:describes ?community ; np:hasAssertion ?ca ; npa:hasValidSignatureForPublicKey ?cpk . filter not exists { ?cx npx:invalidates ?cnp ; npa:hasValidSignatureForPublicKey ?cpk . } } graph ?ca { ?community rdfs:label ?community_label . } } } optional { { select ?qpk where { service { select distinct ?qpk where { graph npa:graph { npa:hasValidSignatureForPublicKey ?curators_pk . ?curators_np npa:hasValidSignatureForPublicKey ?curators_pk ; np:hasAssertion ?curators_a . filter not exists { ?curators_x npx:invalidates ?curators_np ; npa:hasValidSignatureForPublicKey ?curators_pk . } } graph npa:networkGraph { ?curators_np (npx:supersedes)* . filter not exists { ?curators_y npx:supersedes ?curators_np } } graph ?curators_a { ?qk npx:hasPublicKey ?qpk . } } } } } service { graph npa:graph { ?qnp np:hasAssertion ?qa ; npa:hasValidSignatureForPublicKey ?qpk . filter not exists { ?qx npx:invalidates ?qnp ; npa:hasValidSignatureForPublicKey ?qpk . } } graph ?qa { ?qualifier npx:qualifies ?np . } values ?qualifier { } } } bind(if(bound(?qnp), \"✓\", \"\") as ?curated_x) } group by ?fip order by desc(?score) """ . } 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-11-04T09:41:09Z"^^xsd:dateTime; dct:creator ; dct:license ; npx:embeds sub:fip-search; npx:supersedes ; rdfs:label "FIP search"; 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 "MjAmLI2UJzSMLqwtxeXbgqTIi4CGA/1uH8LGE1S9Bqhlp5EIP2gJT4RXogRDGjWQ07m2IuPV6V1zgNdQCJzgqKk/IXk0fW9QdxWsPwc6hXpgi8aKXWqBKEPxEfewzcv3n+498Lc1Wm5HwaLRkfkgbOuolyV99exSSIwvIRiyRPJrh0xNQSTUNkfYhJuiIldSSN9rqDEiHWsPWzV6irFRvfrbBZAsrna2qEmWUZ/NZ/KLE+vcJntY02IJbhitz09YsnYMwZVmWwYW72cSSR/KZeLGs8E0pYsycDA+IzGdJyGNJkwohzb0+h9/p9ZybBLF/MjuvqiGmuNs9ruJbYSLqg=="; npx:hasSignatureTarget this:; npx:signedBy . }