https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/Head
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://www.nanopub.org/nschema#hasAssertion
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/assertion
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://www.nanopub.org/nschema#hasProvenance
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/provenance
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://www.nanopub.org/nschema#hasPublicationInfo
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/pubinfo
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
http://www.nanopub.org/nschema#Nanopublication
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/assertion
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/get-class-landscape-svg
http://purl.org/dc/terms/description
Renders the classes of the given ontology or vocabulary as an inline SVG figure: an Euler ('Venn-style') diagram in which every class is one small dot, positioned by which of three sets it belongs to and coloured by its chemical group. The three sets are: whether the class sits in a chemical group (it declares an rdfs:subClassOf other than the vocabulary's top class peh:BioChemEntity), whether it carries a metabolite or isomer link (peh:isMetaboliteOf / peh:isIsomerOf), and whether it has a chemical role (obo:RO_0000087). The three sets are drawn as overlapping rounded rectangles rather than circles, so that each of the resulting regions holds an exactly aligned grid of dots; a class in none of the three sets sits in the surrounding 'universe' frame. Each region is annotated with its own count, each set with its total, and the frame with the overall total; the figure carries no heading of its own, since the view it is shown in supplies the title. Every dot is a link to the class's part page and carries an SVG title element, so hovering shows the class label together with its group, its metabolite/isomer link and its role identifiers, and clicking opens it. Dot colour encodes the eight largest chemical groups (ranked by number of member classes, resolved at query time rather than hard-coded), with separate shades for a smaller named group and for no group at all; the legend is generated from the same ranking. The class set is exactly the one shown by the 'Get the approved classes of an ontology from space members' query and the corresponding view: the latest non-invalidated definition per class, published by an admin, maintainer or member of the maintaining space, not withdrawn, and approved either explicitly or via the auto-approved helper role. Positions are computed as absolute coordinates from rank sub-selects (the number of same-region classes sorting before this one, by label then URI), never from the order of a group_concat, which RDF4J does not preserve. The colour rank is looked up from a single-row string table rather than joined, because an OPTIONAL around a sub-select does not reliably left-join on a key bound outside it. The figure is intended for a gen:SvgView, which sanitises and embeds the markup; the SVG uses only the static element subset that survives that sanitisation. Its width is given as a percentage so that it fills the width of the panel it is shown in (Nanodash styles an SVG view's figure with max-width 100% and height auto, so a fixed pixel width would only ever cap it); the viewBox keeps the diagram's natural coordinate system, so the whole figure scales with the panel.
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/get-class-landscape-svg
http://purl.org/dc/terms/license
http://www.apache.org/licenses/LICENSE-2.0
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/get-class-landscape-svg
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
https://w3id.org/kpxl/grlc/grlc-query
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/get-class-landscape-svg
http://www.w3.org/2000/01/rdf-schema#label
Get the class landscape of an ontology as SVG
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/get-class-landscape-svg
https://w3id.org/kpxl/grlc/endpoint
https://w3id.org/np/l/nanopub-query-1.1/repo/type/e8cc5bb29ec5597303f8f101c65c545dc124ee0df68ce733764b03adc3237184
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/get-class-landscape-svg
https://w3id.org/kpxl/grlc/sparql
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix dct: <http://purl.org/dc/terms/>
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 peh: <https://w3id.org/peh/terms/>
prefix obo: <http://purl.obolibrary.org/obo/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
select ?svg where {
{
select (group_concat(?block; separator="") as ?body)
(sum(?rcount) as ?total)
(sum(if(substr(?region, 1, 1) = "1", ?rcount, 0)) as ?nGroup)
(sum(if(substr(?region, 2, 1) = "1", ?rcount, 0)) as ?nLink)
(sum(if(substr(?region, 3, 1) = "1", ?rcount, 0)) as ?nRole) where {
{
select ?region ?x0 ?y0 ?cols (count(?class) as ?rcount)
(group_concat(?dot; separator="") as ?dots) where {
{
select ?class ?label ?region ?parent ?roleIds ?parentLabel (count(?o2) - 1 as ?rank) where {
{ select ?class ?label ?region ?parent (min(?sortkey_) as ?sortkey)
(group_concat(distinct ?roleShort; separator=", ") as ?roleIds)
(min(?parentLabel_) as ?parentLabel) where {
values ?_ontology_multi_iri {}
service <https://w3id.org/np/l/nanopub-query-1.1/repo/spaces> {
select (group_concat(?mpk; separator=" ") as ?memberPubkeys) where {
graph npa:graph { npa:thisRepo npa:hasCurrentSpaceState ?stateG . }
values ?_ontology_multi_iri {}
graph ?stateG {
?_ontology_multi_iri npa:isMaintainedBy? ?space .
?ri a gen:RoleInstantiation ; npa:forSpace ?space ; npa:forAgent ?agent ; npa:hasRoleType ?rt .
filter(?rt in (gen:AdminRole, gen:MaintainerRole, gen:MemberRole))
?acct a npa:AccountState ; npa:agent ?agent ; npa:pubkey ?mpk .
}
}
}
graph npa:graph {
?np npx:hasNanopubType owl:Class ; npa:hasValidSignatureForPublicKeyHash ?pubkey ;
dct:created ?date ; npx:introduces ?class ; np:hasAssertion ?a .
filter not exists { ?npx npx:invalidates ?np ; npa:hasValidSignatureForPublicKeyHash ?pubkey . }
}
filter(contains(?memberPubkeys, ?pubkey))
graph ?a { ?class dct:isPartOf|dct:partOf ?_ontology_multi_iri . }
filter not exists { graph ?a { ?class a gen:WithdrawnTerm } }
filter not exists {
graph npa:graph {
?np2 npx:hasNanopubType owl:Class ; npa:hasValidSignatureForPublicKeyHash ?pubkey2 ;
dct:created ?date2 ; npx:introduces ?class ; np:hasAssertion ?a2 .
filter not exists { ?np2x npx:invalidates ?np2 ; npa:hasValidSignatureForPublicKeyHash ?pubkey2 . }
}
filter(contains(?memberPubkeys, ?pubkey2))
graph ?a2 { ?class dct:isPartOf|dct:partOf ?_ontology_multi_iri . }
filter(?date2 > ?date || (?date2 = ?date && str(?np2) > str(?np)))
}
{
select (group_concat(distinct ?apV; separator=" ") as ?approvedNps)
(group_concat(distinct ?disV; separator=" ") as ?disapprovedNps) where {
{
select ?vTarget (max(concat(str(?vDate), ">", str(?vNp), ">", ?vMark)) as ?vWin) where {
values ?_ontology_multi_iri {}
service <https://w3id.org/np/l/nanopub-query-1.1/repo/spaces> {
select (group_concat(?vpk; separator=" ") as ?vMemberPubkeys) where {
graph npa:graph { npa:thisRepo npa:hasCurrentSpaceState ?vStateG . }
values ?_ontology_multi_iri {}
graph ?vStateG {
?_ontology_multi_iri npa:isMaintainedBy? ?vSpace .
?vRi a gen:RoleInstantiation ; npa:forSpace ?vSpace ; npa:forAgent ?vMember ;
npa:hasRoleType ?vRt .
filter(?vRt in (gen:AdminRole, gen:MaintainerRole, gen:MemberRole))
?vAcct a npa:AccountState ; npa:agent ?vMember ; npa:pubkey ?vpk .
}
}
}
service <https://w3id.org/np/l/nanopub-query-1.1/repo/full> {
select distinct ?vTarget ?vNp ?vDate ?vPubkey ?vMark where {
graph npa:graph {
?vTarget npx:hasNanopubType owl:Class ; npx:signedBy ?targetAgent .
?vNp npx:signedBy ?vAgent ; npa:hasValidSignatureForPublicKeyHash ?vPubkey ;
dct:created ?vDate ; np:hasAssertion ?vA .
filter not exists { ?vInv npx:invalidates ?vNp ; npa:hasValidSignatureForPublicKeyHash ?vPubkey . }
}
graph ?vA { ?vAgent ?vPred ?vTarget . }
values ?vPred { npx:approvesOf npx:disapprovesOf }
filter(?vAgent != ?targetAgent)
bind(if(?vPred = npx:approvesOf, "a", "d") as ?vMark)
}
}
filter(contains(?vMemberPubkeys, ?vPubkey))
} group by ?vTarget
}
bind(if(strends(?vWin, "a"), str(?vTarget), "") as ?apV)
bind(if(strends(?vWin, "d"), str(?vTarget), "") as ?disV)
}
}
{
select (sample(?helperPubkeys_) as ?helperPubkeys) where {
service <https://w3id.org/np/l/nanopub-query-1.1/repo/spaces> {
select (group_concat(?hpk; separator=" ") as ?helperPubkeys_) where {
graph npa:graph { npa:thisRepo npa:hasCurrentSpaceState ?hStateG . }
values ?_ontology_multi_iri {}
graph ?hStateG {
?_ontology_multi_iri npa:isMaintainedBy? ?hSpace .
?hRi a gen:RoleInstantiation ; npa:forSpace ?hSpace ; npa:forAgent ?hAgent ;
gen:hasRole <https://w3id.org/np/RASGFRI3F5TtJ4GA4Yaed3esIpTF3pDyJLbpuvsqHzIXc/autoApprovedHelperRole> .
?hAcct a npa:AccountState ; npa:agent ?hAgent ; npa:pubkey ?hpk .
}
}
}
}
}
bind(contains(concat(" ", ?approvedNps, " "), concat(" ", str(?np), " ")) as ?explicitApproved)
bind(contains(concat(" ", ?disapprovedNps, " "), concat(" ", str(?np), " ")) as ?explicitDisapproved)
bind(contains(?helperPubkeys, ?pubkey) as ?isAutoApproved)
filter(?explicitApproved || (?isAutoApproved && !?explicitDisapproved))
optional { graph ?a { ?class rdfs:label ?label . filter(lang(?label) = "") } }
optional { select ?class (min(str(?p)) as ?parent) where {
values ?_ontology_multi_iri {}
graph npa:graph { ?pnp npx:hasNanopubType owl:Class ; npx:introduces ?class ; np:hasAssertion ?pa . }
graph ?pa { ?class dct:isPartOf|dct:partOf ?_ontology_multi_iri ; rdfs:subClassOf ?p .
filter(?p != peh:BioChemEntity) }
} group by ?class }
bind(bound(?parent) as ?g)
bind(exists { graph ?a { ?class peh:isMetaboliteOf|peh:isIsomerOf ?y } } as ?l)
bind(exists { graph ?a { ?class obo:RO_0000087 ?ro } } as ?r)
bind(concat(if(?g,"1","0"), if(?l,"1","0"), if(?r,"1","0")) as ?region)
optional { graph ?a { ?class obo:RO_0000087 ?roleIri . }
bind(replace(replace(str(?roleIri), "^.*[/#]", ""), "_", ":") as ?roleShort) }
optional {
select ?class (min(concat(str(?p), " ~|~ ", coalesce(?pl, ""))) as ?parentCombo) where {
values ?_ontology_multi_iri {}
graph npa:graph { ?pnp npx:hasNanopubType owl:Class ; npx:introduces ?class ; np:hasAssertion ?pa .
filter not exists { ?pgx npx:invalidates ?pnp } }
graph ?pa { ?class dct:isPartOf|dct:partOf ?_ontology_multi_iri ; rdfs:subClassOf ?p .
filter(?p != peh:BioChemEntity) }
optional {
graph npa:graph { ?plnp npx:hasNanopubType owl:Class ; npx:introduces ?p ; np:hasAssertion ?pla . }
graph ?pla { ?p rdfs:label ?pl . filter(lang(?pl) = "") }
}
} group by ?class
}
bind(strafter(?parentCombo, " ~|~ ") as ?parentLabel_)
bind(concat(lcase(coalesce(?label, "zzzz")), "~", str(?class)) as ?sortkey_)
} group by ?class ?label ?region ?parent }
{ select (?class as ?o2) (?region as ?oregion) (?sortkey as ?osortkey) where { select ?class ?region (min(?sortkey_) as ?sortkey) where {
values ?_ontology_multi_iri {}
service <https://w3id.org/np/l/nanopub-query-1.1/repo/spaces> {
select (group_concat(?mpk; separator=" ") as ?memberPubkeys) where {
graph npa:graph { npa:thisRepo npa:hasCurrentSpaceState ?stateG . }
values ?_ontology_multi_iri {}
graph ?stateG {
?_ontology_multi_iri npa:isMaintainedBy? ?space .
?ri a gen:RoleInstantiation ; npa:forSpace ?space ; npa:forAgent ?agent ; npa:hasRoleType ?rt .
filter(?rt in (gen:AdminRole, gen:MaintainerRole, gen:MemberRole))
?acct a npa:AccountState ; npa:agent ?agent ; npa:pubkey ?mpk .
}
}
}
graph npa:graph {
?np npx:hasNanopubType owl:Class ; npa:hasValidSignatureForPublicKeyHash ?pubkey ;
dct:created ?date ; npx:introduces ?class ; np:hasAssertion ?a .
filter not exists { ?npx npx:invalidates ?np ; npa:hasValidSignatureForPublicKeyHash ?pubkey . }
}
filter(contains(?memberPubkeys, ?pubkey))
graph ?a { ?class dct:isPartOf|dct:partOf ?_ontology_multi_iri . }
filter not exists { graph ?a { ?class a gen:WithdrawnTerm } }
filter not exists {
graph npa:graph {
?np2 npx:hasNanopubType owl:Class ; npa:hasValidSignatureForPublicKeyHash ?pubkey2 ;
dct:created ?date2 ; npx:introduces ?class ; np:hasAssertion ?a2 .
filter not exists { ?np2x npx:invalidates ?np2 ; npa:hasValidSignatureForPublicKeyHash ?pubkey2 . }
}
filter(contains(?memberPubkeys, ?pubkey2))
graph ?a2 { ?class dct:isPartOf|dct:partOf ?_ontology_multi_iri . }
filter(?date2 > ?date || (?date2 = ?date && str(?np2) > str(?np)))
}
{
select (group_concat(distinct ?apV; separator=" ") as ?approvedNps)
(group_concat(distinct ?disV; separator=" ") as ?disapprovedNps) where {
{
select ?vTarget (max(concat(str(?vDate), ">", str(?vNp), ">", ?vMark)) as ?vWin) where {
values ?_ontology_multi_iri {}
service <https://w3id.org/np/l/nanopub-query-1.1/repo/spaces> {
select (group_concat(?vpk; separator=" ") as ?vMemberPubkeys) where {
graph npa:graph { npa:thisRepo npa:hasCurrentSpaceState ?vStateG . }
values ?_ontology_multi_iri {}
graph ?vStateG {
?_ontology_multi_iri npa:isMaintainedBy? ?vSpace .
?vRi a gen:RoleInstantiation ; npa:forSpace ?vSpace ; npa:forAgent ?vMember ;
npa:hasRoleType ?vRt .
filter(?vRt in (gen:AdminRole, gen:MaintainerRole, gen:MemberRole))
?vAcct a npa:AccountState ; npa:agent ?vMember ; npa:pubkey ?vpk .
}
}
}
service <https://w3id.org/np/l/nanopub-query-1.1/repo/full> {
select distinct ?vTarget ?vNp ?vDate ?vPubkey ?vMark where {
graph npa:graph {
?vTarget npx:hasNanopubType owl:Class ; npx:signedBy ?targetAgent .
?vNp npx:signedBy ?vAgent ; npa:hasValidSignatureForPublicKeyHash ?vPubkey ;
dct:created ?vDate ; np:hasAssertion ?vA .
filter not exists { ?vInv npx:invalidates ?vNp ; npa:hasValidSignatureForPublicKeyHash ?vPubkey . }
}
graph ?vA { ?vAgent ?vPred ?vTarget . }
values ?vPred { npx:approvesOf npx:disapprovesOf }
filter(?vAgent != ?targetAgent)
bind(if(?vPred = npx:approvesOf, "a", "d") as ?vMark)
}
}
filter(contains(?vMemberPubkeys, ?vPubkey))
} group by ?vTarget
}
bind(if(strends(?vWin, "a"), str(?vTarget), "") as ?apV)
bind(if(strends(?vWin, "d"), str(?vTarget), "") as ?disV)
}
}
{
select (sample(?helperPubkeys_) as ?helperPubkeys) where {
service <https://w3id.org/np/l/nanopub-query-1.1/repo/spaces> {
select (group_concat(?hpk; separator=" ") as ?helperPubkeys_) where {
graph npa:graph { npa:thisRepo npa:hasCurrentSpaceState ?hStateG . }
values ?_ontology_multi_iri {}
graph ?hStateG {
?_ontology_multi_iri npa:isMaintainedBy? ?hSpace .
?hRi a gen:RoleInstantiation ; npa:forSpace ?hSpace ; npa:forAgent ?hAgent ;
gen:hasRole <https://w3id.org/np/RASGFRI3F5TtJ4GA4Yaed3esIpTF3pDyJLbpuvsqHzIXc/autoApprovedHelperRole> .
?hAcct a npa:AccountState ; npa:agent ?hAgent ; npa:pubkey ?hpk .
}
}
}
}
}
bind(contains(concat(" ", ?approvedNps, " "), concat(" ", str(?np), " ")) as ?explicitApproved)
bind(contains(concat(" ", ?disapprovedNps, " "), concat(" ", str(?np), " ")) as ?explicitDisapproved)
bind(contains(?helperPubkeys, ?pubkey) as ?isAutoApproved)
filter(?explicitApproved || (?isAutoApproved && !?explicitDisapproved))
optional { graph ?a { ?class rdfs:label ?label . filter(lang(?label) = "") } }
optional { select ?class (min(str(?p)) as ?parent) where {
values ?_ontology_multi_iri {}
graph npa:graph { ?pnp npx:hasNanopubType owl:Class ; npx:introduces ?class ; np:hasAssertion ?pa . }
graph ?pa { ?class dct:isPartOf|dct:partOf ?_ontology_multi_iri ; rdfs:subClassOf ?p .
filter(?p != peh:BioChemEntity) }
} group by ?class }
bind(bound(?parent) as ?g)
bind(exists { graph ?a { ?class peh:isMetaboliteOf|peh:isIsomerOf ?y } } as ?l)
bind(exists { graph ?a { ?class obo:RO_0000087 ?ro } } as ?r)
bind(concat(if(?g,"1","0"), if(?l,"1","0"), if(?r,"1","0")) as ?region)
bind(concat(lcase(coalesce(?label, "zzzz")), "~", str(?class)) as ?sortkey_)
} group by ?class ?region } }
filter(?oregion = ?region && ?osortkey <= ?sortkey)
} group by ?class ?label ?region ?parent ?roleIds ?parentLabel
}
{ select (group_concat(concat("[", ?parentKey, ">", str(?grank), "]"); separator="") as ?groupTable) where { select (str(?p) as ?parentKey) (min(?plabel) as ?glabel) (count(?o) - 1 as ?grank) where {
{ select ?p (count(distinct ?c) as ?psize) (min(?pl) as ?plabel) where {
values ?_ontology_multi_iri {}
graph npa:graph { ?gnp npx:hasNanopubType owl:Class ; npx:introduces ?c ; np:hasAssertion ?ga .
filter not exists { ?gx npx:invalidates ?gnp } }
graph ?ga { ?c dct:isPartOf|dct:partOf ?_ontology_multi_iri ; rdfs:subClassOf ?p .
filter(?p != peh:BioChemEntity) }
optional {
graph npa:graph { ?lnp npx:hasNanopubType owl:Class ; npx:introduces ?p ; np:hasAssertion ?la . }
graph ?la { ?p rdfs:label ?pl . filter(lang(?pl) = "") }
}
} group by ?p }
{ select (?p as ?o) (?psize as ?opsize) where {
select ?p (count(distinct ?c) as ?psize) where {
values ?_ontology_multi_iri {}
graph npa:graph { ?gnp2 npx:hasNanopubType owl:Class ; npx:introduces ?c ; np:hasAssertion ?ga2 .
filter not exists { ?gx2 npx:invalidates ?gnp2 } }
graph ?ga2 { ?c dct:isPartOf|dct:partOf ?_ontology_multi_iri ; rdfs:subClassOf ?p .
filter(?p != peh:BioChemEntity) }
} group by ?p } }
filter(?opsize > ?psize || (?opsize = ?psize && str(?o) <= str(?p)))
} group by ?p } }
bind(coalesce(strbefore(strafter(?groupTable, concat("[", ?parent, ">")), "]"), "") as ?grankStr)
bind(coalesce(xsd:integer(?grankStr), 99) as ?grank_)
bind(if(?grank_ = 99, 9, if(?grank_ < 8, ?grank_, 8)) as ?colorIdx)
bind(if(?colorIdx = 9, "#C9C9C9", if(?colorIdx = 0, "#3C6DB0", if(?colorIdx = 1, "#E07B39", if(?colorIdx = 2, "#3F9E5C", if(?colorIdx = 3, "#C0392B", if(?colorIdx = 4, "#7D6BB5", if(?colorIdx = 5, "#8A6A4F", if(?colorIdx = 6, "#D46FB8", if(?colorIdx = 7, "#B39200", "#8A8A8A"))))))))) as ?fill)
values (?rg ?x0 ?y0 ?cols) {
("010" 64 54 42) ("011" 382 54 6) ("001" 432 54 42)
("110" 158 120 30) ("111" 382 120 6) ("101" 432 120 30)
("100" 162 162 68) ("000" 26 262 106)
}
filter(?rg = ?region)
bind(floor(?rank / ?cols) as ?row)
bind(?x0 + (?rank - ?cols * ?row) * 7 as ?cx)
bind(?y0 + ?row * 7 as ?cy)
bind(concat(
replace(replace(replace(coalesce(?label, "(no label)"), "&", "&"), "<", "<"), ">", ">"),
if(coalesce(?parentLabel, "") = "", "", concat(" | group: ", replace(replace(replace(?parentLabel, "&", "&"), "<", "<"), ">", ">"))),
if(substr(?region, 2, 1) = "1", " | metabolite/isomer link", ""),
if(?roleIds = "", "", concat(" | role: ", replace(replace(replace(?roleIds, "&", "&"), "<", "<"), ">", ">")))
) as ?tip)
bind(concat('<a href="/part?id=', encode_for_uri(str(?class)),
'"><circle cx="', str(?cx), '" cy="', str(?cy),
'" r="2.4" fill="', ?fill, '" stroke="#ffffff" stroke-width="0.6"><title>',
?tip, '</title></circle></a>') as ?dot)
} group by ?region ?x0 ?y0 ?cols
}
bind(concat(?dots,
'<text x="', str(?x0), '" y="', str(?y0 + ceil(?rcount / ?cols) * 7 + 10),
'" font-size="9" fill="#6b6b6b">n = ', str(?rcount), '</text>') as ?block)
}
}
{
select (group_concat(?leg; separator="") as ?legend) where {
{ select (str(?p) as ?parentKey) (min(?plabel) as ?glabel) (count(?o) - 1 as ?grank) where {
{ select ?p (count(distinct ?c) as ?psize) (min(?pl) as ?plabel) where {
values ?_ontology_multi_iri {}
graph npa:graph { ?gnp npx:hasNanopubType owl:Class ; npx:introduces ?c ; np:hasAssertion ?ga .
filter not exists { ?gx npx:invalidates ?gnp } }
graph ?ga { ?c dct:isPartOf|dct:partOf ?_ontology_multi_iri ; rdfs:subClassOf ?p .
filter(?p != peh:BioChemEntity) }
optional {
graph npa:graph { ?lnp npx:hasNanopubType owl:Class ; npx:introduces ?p ; np:hasAssertion ?la . }
graph ?la { ?p rdfs:label ?pl . filter(lang(?pl) = "") }
}
} group by ?p }
{ select (?p as ?o) (?psize as ?opsize) where {
select ?p (count(distinct ?c) as ?psize) where {
values ?_ontology_multi_iri {}
graph npa:graph { ?gnp2 npx:hasNanopubType owl:Class ; npx:introduces ?c ; np:hasAssertion ?ga2 .
filter not exists { ?gx2 npx:invalidates ?gnp2 } }
graph ?ga2 { ?c dct:isPartOf|dct:partOf ?_ontology_multi_iri ; rdfs:subClassOf ?p .
filter(?p != peh:BioChemEntity) }
} group by ?p } }
filter(?opsize > ?psize || (?opsize = ?psize && str(?o) <= str(?p)))
} group by ?p }
filter(?grank < 8)
bind(20 + (?grank - 3 * floor(?grank / 3)) * 258 as ?lx)
bind(378 + floor(?grank / 3) * 17 as ?ly)
bind(if(?grank = 9, "#C9C9C9", if(?grank = 0, "#3C6DB0", if(?grank = 1, "#E07B39", if(?grank = 2, "#3F9E5C", if(?grank = 3, "#C0392B", if(?grank = 4, "#7D6BB5", if(?grank = 5, "#8A6A4F", if(?grank = 6, "#D46FB8", if(?grank = 7, "#B39200", "#8A8A8A"))))))))) as ?lfill)
bind(concat('<circle cx="', str(?lx + 4), '" cy="', str(?ly - 3),
'" r="4" fill="', ?lfill, '" stroke="#ffffff" stroke-width="0.6"></circle>',
'<text x="', str(?lx + 13), '" y="', str(?ly),
'" font-size="10" fill="#333333">', replace(replace(replace(coalesce(?glabel, "(unnamed group)"), "&", "&"), "<", "<"), ">", ">"), '</text>') as ?leg)
}
}
bind(concat(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 452" width="100%" height="565" ',
'preserveAspectRatio="xMidYMin meet" font-family="sans-serif">',
'<desc>Each dot is one class of the vocabulary, placed by which of the three sets it belongs to ',
'and coloured by its chemical group.</desc>',
'<rect x="0" y="0" width="800" height="452" fill="#ffffff"></rect>',
'<rect x="14" y="8" width="772" height="334" rx="6" fill="none" stroke="#bbbbbb" stroke-width="1"></rect>',
'<rect x="56" y="32" width="368" height="120" rx="8" fill="#3C6DB0" fill-opacity="0.07" stroke="#3C6DB0" stroke-width="1.2"></rect>',
'<rect x="376" y="32" width="368" height="120" rx="8" fill="#3F9E5C" fill-opacity="0.07" stroke="#3F9E5C" stroke-width="1.2"></rect>',
'<rect x="150" y="112" width="500" height="125" rx="8" fill="#C0392B" fill-opacity="0.07" stroke="#C0392B" stroke-width="1.2"></rect>',
'<text x="64" y="48" font-size="11" fill="#2f5488">has metabolite / isomer link (', str(?nLink), ')</text>',
'<text x="432" y="48" font-size="11" fill="#2f7048">has a chemical role (', str(?nRole), ')</text>',
'<text x="162" y="229" font-size="11" fill="#8f3336">in a chemical group (', str(?nGroup), ')</text>',
'<text x="26" y="330" font-size="11" fill="#6b6b6b">all classes in this vocabulary (', str(?total), ')</text>',
?body,
'<text x="14" y="366" font-size="11" fill="#111111">chemical groups (largest first)</text>',
?legend,
'<circle cx="24" cy="434" r="4" fill="#8A8A8A" stroke="#ffffff" stroke-width="0.6"></circle>',
'<text x="33" y="437" font-size="10" fill="#333333">another group</text>',
'<circle cx="282" cy="434" r="4" fill="#C9C9C9" stroke="#ffffff" stroke-width="0.6"></circle>',
'<text x="291" y="437" font-size="10" fill="#333333">no chemical group</text>',
'</svg>') as ?svg)
}
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/provenance
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/assertion
http://www.w3.org/ns/prov#wasAttributedTo
https://orcid.org/0000-0002-1267-0234
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/pubinfo
https://orcid.org/0000-0002-1267-0234
http://xmlns.com/foaf/0.1/name
Tobias Kuhn
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://purl.org/dc/terms/created
2026-08-26T09:34:49Z
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://purl.org/dc/terms/creator
https://orcid.org/0000-0002-1267-0234
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://purl.org/dc/terms/license
https://creativecommons.org/publicdomain/zero/1.0/
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://purl.org/nanopub/x/embeds
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/get-class-landscape-svg
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://purl.org/nanopub/x/supersedes
https://w3id.org/np/RAU9jhzt-Dhht4Q4cY62prqCnCW7OCQpVMOjVKUcJdQHM
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
http://www.w3.org/2000/01/rdf-schema#label
Get the class landscape of an ontology as SVG
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
https://w3id.org/np/o/ntemplate/wasCreatedFromProvenanceTemplate
https://w3id.org/np/RA7lSq6MuK_TIC6JMSHvLtee3lpLoZDOqLJCLXevnrPoU
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
https://w3id.org/np/o/ntemplate/wasCreatedFromPubinfoTemplate
https://w3id.org/np/RACJ58Gvyn91LqCKIO9zu1eijDQIeEff28iyDrJgjSJF8
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
https://w3id.org/np/o/ntemplate/wasCreatedFromPubinfoTemplate
https://w3id.org/np/RAoTD7udB2KtUuOuAe74tJi1t3VzK0DyWS7rYVAq1GRvw
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
https://w3id.org/np/o/ntemplate/wasCreatedFromPubinfoTemplate
https://w3id.org/np/RAukAcWHRDlkqxk7H2XNSegc1WnHI569INvNr-xdptDGI
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
https://w3id.org/np/o/ntemplate/wasCreatedFromTemplate
https://w3id.org/np/RAEFAt-QcFK0ZhqfvlsmS10BnzGJA0xwOICZXkO-ai87k
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/sig
http://purl.org/nanopub/x/hasAlgorithm
RSA
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/sig
http://purl.org/nanopub/x/hasPublicKey
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwUtewGCpT5vIfXYE1bmf/Uqu1ojqnWdYxv+ySO80ul8Gu7m8KoyPAwuvaPj0lvPtHrg000qMmkxzKhYknEjq8v7EerxZNYp5B3/3+5ZpuWOYAs78UnQVjbHSmDdmryr4D4VvvNIiUmd0yxci47dTFUj4DvfHnGd6hVe5+goqdcwIDAQAB
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/sig
http://purl.org/nanopub/x/hasSignature
P6kbLRAaxJEPOVWlcoDP+xnelW6lyVP9lt8QBYOURQFN4RWp5E65sGivpMzjMVCeHRKoYhXyEXwp6lkwzpZr9LU5D46uEGuLd3VOmNCToLx5veiZhPvaFXMc844J1fsB/Rfx29OAqmH57gRNxuotqCd+UDCxOJDF9SjQJO1X7A0=
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/sig
http://purl.org/nanopub/x/hasSignatureTarget
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ
https://w3id.org/np/RA8ZHeRMAJToRTMM6VYdUPm5noZ7ACSqeeUW6SAk66jKQ/sig
http://purl.org/nanopub/x/signedBy
https://orcid.org/0000-0002-1267-0234