https://w3id.org/np/RAReI5TwNByIwqmZ7poMBf18cg5sCxVh2Sxjx1v6hHEEU
.trig | .trig.txt | .jelly | .jelly.txt | .jsonld | .jsonld.txt | .nq | .nq.txt | .xml | .xml.txt
@prefix this: <https://w3id.org/np/RAReI5TwNByIwqmZ7poMBf18cg5sCxVh2Sxjx1v6hHEEU> .
@prefix sub: <https://w3id.org/np/RAReI5TwNByIwqmZ7poMBf18cg5sCxVh2Sxjx1v6hHEEU/> .
@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-trust-network-overview-svg a grlc:grlc-query;
dct:description "Returns a single result row with one 'svg' column holding a complete SVG diagram of the endorsement backbone of the whole nanopublication trust network, computed entirely from the trust state of the network. This is the query behind the 'Trust network overview' SVG view (gen:SvgView). Every agent that has endorsed at least one other agent is drawn as a node, arranged in horizontal bands by its minimum depth from the trust seed and ordered within each band by the number of agents it endorsed; the node radius grows with that number, which is also printed below the agent's name. Lines connect an endorsing agent to each agent it endorsed, and a dashed amber ring marks an agent that endorsed itself across two of its own keys. Node color encodes depth, with contested agents in red and skipped (rejected) agents in gray. Each node links root-relatively (/user?id=...) to that agent's user page. The query reads npa:EndorsementLink nodes (npa:fromAgent / npa:toAgent) together with the npa:AccountState rows of the current trust state, so it needs no federated SERVICE call and no scan of the full repository; agent-level names come from the canonical foaf:name in the trust state itself. Per-pubkey duplicate rows are collapsed, and positions are computed via rank subqueries, so the output is deterministic. The 'resource' parameter is the page the view is shown on; it is not used by the diagram, which always shows the whole network.";
dct:license <http://www.apache.org/licenses/LICENSE-2.0>;
rdfs:label "Get trust network overview diagram as SVG";
grlc:endpoint <https://w3id.org/np/l/nanopub-query-1.1/repo/trust>;
grlc:sparql """prefix npa: <http://purl.org/nanopub/admin/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
select (concat(\"<svg xmlns='http://www.w3.org/2000/svg' width='100%' viewBox='0 0 1600 725' font-family='sans-serif'><text x='8' y='20' font-size='14' font-weight='bold' fill='#222'>Trust network \\u2014 endorsement backbone</text><text x='8' y='36' font-size='10' fill='#666'>Each node is an agent who has endorsed at least one other agent; the number below the name is how many agents they endorsed. Lines are endorsements; dashed ring = self-endorsement across keys.</text><text x='8' y='68' font-family='sans-serif' font-size='10' fill='#999'>depth 1</text><line x1='0' y1='72' x2='1600' y2='72' stroke='#e4e4e4' stroke-width='1'></line><text x='8' y='243' font-family='sans-serif' font-size='10' fill='#999'>depth 2</text><line x1='0' y1='247' x2='1600' y2='247' stroke='#e4e4e4' stroke-width='1'></line><text x='8' y='418' font-family='sans-serif' font-size='10' fill='#999'>depth 3</text><line x1='0' y1='422' x2='1600' y2='422' stroke='#e4e4e4' stroke-width='1'></line><text x='8' y='593' font-family='sans-serif' font-size='10' fill='#999'>depth 4</text><line x1='0' y1='597' x2='1600' y2='597' stroke='#e4e4e4' stroke-width='1'></line>\", ?edgesvg, ?selfsvg, ?nodesvg, \"</svg>\") as ?svg) where {
bind(?_resource_iri as ?pageResource)
{ select (group_concat(?eline; separator=\"\") as ?edgesvg) where {
{ select ?aF ?depF ?outF
((round(40 + ((1600-80) * (?rankF - 0.5)) / ?bnF)) as ?xF)
((110 + (?depF - 1) * 175) as ?yF) where {
{ select ?aF ?depF ?outF (count(distinct ?a2F) as ?rankF) where {
{ select ?aF (min(?dF1) as ?depF) (count(distinct ?toF1) as ?outF) where {
npa:thisRepo npa:hasCurrentTrustState ?tsF1 .
graph ?tsF1 { ?lF1 a npa:EndorsementLink ; npa:fromAgent ?aF ; npa:toAgent ?toF1 .
?sF1 a npa:AccountState ; npa:agent ?aF ; npa:depth ?dF1 }
} group by ?aF }
{ select ?a2F (min(?dF2) as ?dep2F) (count(distinct ?toF2) as ?out2F) where {
npa:thisRepo npa:hasCurrentTrustState ?tsF2 .
graph ?tsF2 { ?lF2 a npa:EndorsementLink ; npa:fromAgent ?a2F ; npa:toAgent ?toF2 .
?sF2 a npa:AccountState ; npa:agent ?a2F ; npa:depth ?dF2 }
} group by ?a2F }
filter(?dep2F = ?depF && (?out2F > ?outF
|| (?out2F = ?outF && str(?a2F) <= str(?aF))))
} group by ?aF ?depF ?outF }
{ select ?depBF (count(*) as ?bnF) where {
{ select ?aBF (min(?dF3) as ?depBF) (count(distinct ?toF3) as ?outBF) where {
npa:thisRepo npa:hasCurrentTrustState ?tsF3 .
graph ?tsF3 { ?lF3 a npa:EndorsementLink ; npa:fromAgent ?aBF ; npa:toAgent ?toF3 .
?sF3 a npa:AccountState ; npa:agent ?aBF ; npa:depth ?dF3 }
} group by ?aBF }
} group by ?depBF }
filter(?depBF = ?depF)
} }
{ select ?aT ?depT ?outT
((round(40 + ((1600-80) * (?rankT - 0.5)) / ?bnT)) as ?xT)
((110 + (?depT - 1) * 175) as ?yT) where {
{ select ?aT ?depT ?outT (count(distinct ?a2T) as ?rankT) where {
{ select ?aT (min(?dT1) as ?depT) (count(distinct ?toT1) as ?outT) where {
npa:thisRepo npa:hasCurrentTrustState ?tsT1 .
graph ?tsT1 { ?lT1 a npa:EndorsementLink ; npa:fromAgent ?aT ; npa:toAgent ?toT1 .
?sT1 a npa:AccountState ; npa:agent ?aT ; npa:depth ?dT1 }
} group by ?aT }
{ select ?a2T (min(?dT2) as ?dep2T) (count(distinct ?toT2) as ?out2T) where {
npa:thisRepo npa:hasCurrentTrustState ?tsT2 .
graph ?tsT2 { ?lT2 a npa:EndorsementLink ; npa:fromAgent ?a2T ; npa:toAgent ?toT2 .
?sT2 a npa:AccountState ; npa:agent ?a2T ; npa:depth ?dT2 }
} group by ?a2T }
filter(?dep2T = ?depT && (?out2T > ?outT
|| (?out2T = ?outT && str(?a2T) <= str(?aT))))
} group by ?aT ?depT ?outT }
{ select ?depBT (count(*) as ?bnT) where {
{ select ?aBT (min(?dT3) as ?depBT) (count(distinct ?toT3) as ?outBT) where {
npa:thisRepo npa:hasCurrentTrustState ?tsT3 .
graph ?tsT3 { ?lT3 a npa:EndorsementLink ; npa:fromAgent ?aBT ; npa:toAgent ?toT3 .
?sT3 a npa:AccountState ; npa:agent ?aBT ; npa:depth ?dT3 }
} group by ?aBT }
} group by ?depBT }
filter(?depBT = ?depT)
} }
{ select distinct ?aF ?aT where {
npa:thisRepo npa:hasCurrentTrustState ?tsE .
graph ?tsE { ?lE a npa:EndorsementLink ; npa:fromAgent ?aF ; npa:toAgent ?aT }
filter(?aF != ?aT)
} }
bind(concat(\"<line x1='\", str(?xF), \"' y1='\", str(?yF + 13),
\"' x2='\", str(?xT), \"' y2='\", str(?yT - 15),
\"' stroke='#7aa7d0' stroke-opacity='0.45' stroke-width='1'></line>\") as ?eline)
} }
{ select (group_concat(?sline; separator=\"\") as ?selfsvg) where {
{ select ?aS ?depS ?outS
((round(40 + ((1600-80) * (?rankS - 0.5)) / ?bnS)) as ?xS)
((110 + (?depS - 1) * 175) as ?yS) where {
{ select ?aS ?depS ?outS (count(distinct ?a2S) as ?rankS) where {
{ select ?aS (min(?dS1) as ?depS) (count(distinct ?toS1) as ?outS) where {
npa:thisRepo npa:hasCurrentTrustState ?tsS1 .
graph ?tsS1 { ?lS1 a npa:EndorsementLink ; npa:fromAgent ?aS ; npa:toAgent ?toS1 .
?sS1 a npa:AccountState ; npa:agent ?aS ; npa:depth ?dS1 }
} group by ?aS }
{ select ?a2S (min(?dS2) as ?dep2S) (count(distinct ?toS2) as ?out2S) where {
npa:thisRepo npa:hasCurrentTrustState ?tsS2 .
graph ?tsS2 { ?lS2 a npa:EndorsementLink ; npa:fromAgent ?a2S ; npa:toAgent ?toS2 .
?sS2 a npa:AccountState ; npa:agent ?a2S ; npa:depth ?dS2 }
} group by ?a2S }
filter(?dep2S = ?depS && (?out2S > ?outS
|| (?out2S = ?outS && str(?a2S) <= str(?aS))))
} group by ?aS ?depS ?outS }
{ select ?depBS (count(*) as ?bnS) where {
{ select ?aBS (min(?dS3) as ?depBS) (count(distinct ?toS3) as ?outBS) where {
npa:thisRepo npa:hasCurrentTrustState ?tsS3 .
graph ?tsS3 { ?lS3 a npa:EndorsementLink ; npa:fromAgent ?aBS ; npa:toAgent ?toS3 .
?sS3 a npa:AccountState ; npa:agent ?aBS ; npa:depth ?dS3 }
} group by ?aBS }
} group by ?depBS }
filter(?depBS = ?depS)
} }
{ select distinct ?aS where {
npa:thisRepo npa:hasCurrentTrustState ?tsS .
graph ?tsS { ?lS a npa:EndorsementLink ; npa:fromAgent ?aS ; npa:toAgent ?aS }
} }
bind(concat(\"<circle cx='\", str(?xS), \"' cy='\", str(?yS),
\"' r='\", str(round(10 * (6 + 1.7 * (?outS * 1.0) / (1 + ?outS * 0.06))) / 10),
\"' fill='none' stroke='#d08a3a' stroke-width='1.4' stroke-dasharray='2 2'></circle>\") as ?sline)
} }
{ select (group_concat(?nline; separator=\"\") as ?nodesvg) where {
{ select ?aN ?depN ?outN
((round(40 + ((1600-80) * (?rankN - 0.5)) / ?bnN)) as ?xN)
((110 + (?depN - 1) * 175) as ?yN) where {
{ select ?aN ?depN ?outN (count(distinct ?a2N) as ?rankN) where {
{ select ?aN (min(?dN1) as ?depN) (count(distinct ?toN1) as ?outN) where {
npa:thisRepo npa:hasCurrentTrustState ?tsN1 .
graph ?tsN1 { ?lN1 a npa:EndorsementLink ; npa:fromAgent ?aN ; npa:toAgent ?toN1 .
?sN1 a npa:AccountState ; npa:agent ?aN ; npa:depth ?dN1 }
} group by ?aN }
{ select ?a2N (min(?dN2) as ?dep2N) (count(distinct ?toN2) as ?out2N) where {
npa:thisRepo npa:hasCurrentTrustState ?tsN2 .
graph ?tsN2 { ?lN2 a npa:EndorsementLink ; npa:fromAgent ?a2N ; npa:toAgent ?toN2 .
?sN2 a npa:AccountState ; npa:agent ?a2N ; npa:depth ?dN2 }
} group by ?a2N }
filter(?dep2N = ?depN && (?out2N > ?outN
|| (?out2N = ?outN && str(?a2N) <= str(?aN))))
} group by ?aN ?depN ?outN }
{ select ?depBN (count(*) as ?bnN) where {
{ select ?aBN (min(?dN3) as ?depBN) (count(distinct ?toN3) as ?outBN) where {
npa:thisRepo npa:hasCurrentTrustState ?tsN3 .
graph ?tsN3 { ?lN3 a npa:EndorsementLink ; npa:fromAgent ?aBN ; npa:toAgent ?toN3 .
?sN3 a npa:AccountState ; npa:agent ?aBN ; npa:depth ?dN3 }
} group by ?aBN }
} group by ?depBN }
filter(?depBN = ?depN)
} }
{ select ?aN (min(?nmN0) as ?nmN) (min(?statN0) as ?statN) where {
npa:thisRepo npa:hasCurrentTrustState ?tsN .
graph ?tsN { ?stN0 a npa:AccountState ; npa:agent ?aN ; npa:trustStatus ?statN0 .
optional { ?aN foaf:name ?nmN0 } }
} group by ?aN }
bind(coalesce(?nmN, replace(str(?aN), \"^.*/\", \"\")) as ?label)
bind(if(strlen(?label) > 17, concat(substr(?label, 1, 16), \"\\u2026\"), ?label) as ?lab)
bind(round(10 * (2.5 + 1.35 * (?outN * 1.0) / (1 + ?outN * 0.055))) / 10 as ?r)
bind(if(?statN = npa:contested, \"#c8553d\",
if(?statN = npa:skipped, \"#8a8a8a\",
if(?depN = 1, \"#1f6cb0\",
if(?depN = 2, \"#3d8fd1\",
if(?depN = 3, \"#6fb0e0\", \"#a9cdec\"))))) as ?fill)
bind(concat(
\"<a href='/user?id=\", encode_for_uri(str(?aN)), \"'>\",
\"<circle cx='\", str(?xN), \"' cy='\", str(?yN), \"' r='\", str(?r),
\"' fill='\", ?fill, \"' stroke='#0d3c61' stroke-width='0.8'></circle>\",
\"<text x='\", str(?xN), \"' y='\", str(?yN + ?r + 11),
\"' text-anchor='middle' font-family='sans-serif' font-size='9' fill='#0b73da'>\",
?lab, \"</text>\",
\"<text x='\", str(?xN), \"' y='\", str(?yN + ?r + 21),
\"' text-anchor='middle' font-family='sans-serif' font-size='8' fill='#666'>\",
str(?outN), \"</text>\",
\"</a>\") as ?nline)
} }
}""" .
}
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-08-25T14:08:00Z"^^xsd:dateTime;
dct:creator orcid:0000-0002-1267-0234;
dct:license <https://creativecommons.org/licenses/by/4.0/>;
npx:embeds sub:get-trust-network-overview-svg;
rdfs:label "Get trust network overview diagram as SVG";
nt:wasCreatedFromProvenanceTemplate <https://w3id.org/np/RA7lSq6MuK_TIC6JMSHvLtee3lpLoZDOqLJCLXevnrPoU>;
nt:wasCreatedFromPubinfoTemplate <https://w3id.org/np/RACJ58Gvyn91LqCKIO9zu1eijDQIeEff28iyDrJgjSJF8>,
<https://w3id.org/np/RAukAcWHRDlkqxk7H2XNSegc1WnHI569INvNr-xdptDGI>;
nt:wasCreatedFromTemplate <https://w3id.org/np/RAEFAt-QcFK0ZhqfvlsmS10BnzGJA0xwOICZXkO-ai87k> .
sub:sig npx:hasAlgorithm "RSA";
npx:hasPublicKey "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwUtewGCpT5vIfXYE1bmf/Uqu1ojqnWdYxv+ySO80ul8Gu7m8KoyPAwuvaPj0lvPtHrg000qMmkxzKhYknEjq8v7EerxZNYp5B3/3+5ZpuWOYAs78UnQVjbHSmDdmryr4D4VvvNIiUmd0yxci47dTFUj4DvfHnGd6hVe5+goqdcwIDAQAB";
npx:hasSignature "GtE6eJ0eajxQxo1MAV9ruT+z/eYChK0kNJii31+xWtcYF+oTogHOrEL1vQBWKGzQqjxULvjhLdZMaIU4SDpvRhJQVOXIyr9okCN9wGPEd5s2t3bjwKf1zPUnqmuQ5kQJ5o1OXpJODwwUcQhEECxTiV2r2qNVC4AV1pJIcKRNjWI=";
npx:hasSignatureTarget this:;
npx:signedBy orcid:0000-0002-1267-0234 .
}