sub:assertion {
sub:get-latest-nanopubs-from-pubkeys-userid dct:description "This query returns the latest nanopublications from the given set of pubkey hashes and/or from the given user IRI." ;
dct:license <
http://www.apache.org/licenses/LICENSE-2.0> ;
a <
https://w3id.org/kpxl/grlc/grlc-query> ;
rdfs:label "Get the latest nanopublications from pubkeys/userid" ;
<
https://w3id.org/kpxl/grlc/endpoint> <
https://w3id.org/np/l/nanopub-query-1.1/repo/meta> ;
<
https://w3id.org/kpxl/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 xsd: <http://www.w3.org/2001/XMLSchema#>
prefix dct: <http://purl.org/dc/terms/>
select ?np ?label ?pubkey ?date where {
#==================== MULTI-VALUE PLACEHOLDER =====================#------ config: ------
{ select ?pkh { # <- VAR pkh
bind(?__pubkeyhashes as ?pubkeyhashes) # <- VAR __pubkeyhashes
bind(if(bound(?pubkeyhashes), ?pubkeyhashes, \"\") as ?vs) #
{select*{optional{?a ?b ?c}}limit 1} # (for some Virtuoso ver.) #
values ?x {0 1 2 3 4 5 6 7 8 9} values ?y {0 1 2 3 4 5 6 7 8 9} #
bind((10*?x)+?y as ?n) # (works up to a maximum of 100 values) #
bind(\" \" as ?sep) # (separator as single regex-compatible char) # <- CONST sep
bind(concat(\"^([^\",?sep,\"]*\",?sep,\"){\",str(?n),\"}\") as ?p) #
bind(concat(?sep,\".*\") as ?p0) #
filter(if(?n=0,true,regex(?vs,?p))) # (?n=0 check for Viruoso) #
bind(replace(if(?n=0,?vs,replace(?vs,?p,\"\")),?p0,\"\") as ?pkh) # <- VAR pkh
filter(!bound(?pkh) || exists {?any_np npa:hasValidSignatureForPublicKeyHash ?pkh }) # Filter out the hashes for which no repo exists; try to do this better with future versions of Nanopub Query
} } #
#==================================================================#---------------------
bind(uri(concat(\"https://w3id.org/np/l/nanopub-query-1.1/repo/pubkey/\", ?pkh)) as ?pubkeyservice)
bind(if(bound(?pkh), ?pubkeyservice, <https://w3id.org/np/l/nanopub-query-1.1/repo/full>) as ?service) # Should be /meta once RDF4J bug is resolved and we can allow for >1 concurrent queries
service ?service {
graph npa:graph {
?np npa:hasValidSignatureForPublicKey ?pubkey .
?np dct:created ?date .
?np dct:creator ?__userid_iri .
optional { ?np rdfs:label ?label }
filter not exists { ?npx npx:invalidates ?np ; npa:hasValidSignatureForPublicKey ?pubkey . }
filter not exists { ?np npx:hasNanopubType npx:retracts . }
}
}
}
order by desc(?date)
limit 100""" .
}