SBGN specifications¶
SBGN is defined by two kinds of specifications: the language specifications define what a glyph and an arc mean and how they may be combined, one for each of the three languages, and the SBGN-ML specification defines how a map is stored as XML. libsbgnpy implements SBGN-ML 0.3 and knows the versions and the vocabularies of the language specifications, see libsbgnpy.specification. The specifications are published on sbgn.github.io/specifications and registered with COMBINE.
The languages¶
| language | specification | publication |
|---|---|---|
| Process Description (PD) | Level 1 Version 2.1 (2026) | Balci, Rougny et al. Systems biology graphical notation: process description language level 1 version 2.1. J Integr Bioinform (2026). 10.1515/jib-2025-0018 |
| Entity Relationship (ER) | Level 1 Version 2.0 (2015) | Sorokin et al. Systems Biology Graphical Notation: Entity Relationship language Level 1 Version 2.0. J Integr Bioinform 12(2):264 (2015). 10.2390/biecoll-jib-2015-264 |
| Activity Flow (AF) | Level 1 Version 1.2 (2015) | Mi et al. Systems Biology Graphical Notation: Activity Flow language Level 1 Version 1.2. J Integr Bioinform 12(2):265 (2015). 10.2390/biecoll-jib-2015-265 |
| SBGN-ML | Version 0.3 (2020) | Bergmann et al. Systems biology graphical notation markup language (SBGNML) version 0.3. J Integr Bioinform 17(2-3):20200016 (2020). 10.1515/jib-2020-0016 |
The version of a map¶
A map states which specification it follows with its version, the identifier of the specification. SBGN-ML 0.3 deprecated the language of a map in favour of the version, and requires one of the two. The version names the language as well, so map_language takes the language from the version, and from the deprecated language if a map has no version:
from libsbgnpy import LATEST, Map, MapLanguage, map_language
map = Map(
id="ethanol",
version=LATEST[MapLanguage.PROCESS_DESCRIPTION],
language=MapLanguage.PROCESS_DESCRIPTION,
)
print(map.version.value)
# http://identifiers.org/combine.specifications/sbgn.pd.level-1.version-2.1
print(map_language(map))
# MapLanguage.PROCESS_DESCRIPTION
LATEST holds the version of the latest specification of every language, set in bold below. Set the language as well if a map is read by tools which only know SBGN-ML 0.2. SPECIFICATIONS maps every MapVersion to its Specification, i.e., its language, level, version, year and DOI. The version of a map is http://identifiers.org/combine.specifications/ followed by the identifier of the specification:
| specification | year | publication | identifier |
|---|---|---|---|
| PD L1V2.1 | 2026 | 10.1515/jib-2025-0018 | sbgn.pd.level-1.version-2.1 |
| PD L1V2.0 | 2019 | 10.1515/jib-2019-0022 | sbgn.pd.level-1.version-2.0 |
| PD L1V1.3 | 2015 | 10.2390/biecoll-jib-2015-263 | sbgn.pd.level-1.version-1.3 |
| PD L1V1.2 | 2010 | sbgn.pd.level-1.version-1.2 |
|
| PD L1V1.1 | 2009 | sbgn.pd.level-1.version-1.1 |
|
| PD L1V1.0 | 2008 | sbgn.pd.level-1.version-1.0 |
|
| PD L1V1 | sbgn.pd.level-1.version-1 |
||
| ER L1V2.0 | 2015 | 10.2390/biecoll-jib-2015-264 | sbgn.er.level-1.version-2 |
| ER L1V1.2 | 2011 | sbgn.er.level-1.version-1.2 |
|
| ER L1V1.1 | 2010 | sbgn.er.level-1.version-1.1 |
|
| ER L1V1.0 | 2009 | sbgn.er.level-1.version-1.0 |
|
| ER L1V1 | sbgn.er.level-1.version-1 |
||
| AF L1V1.2 | 2015 | 10.2390/biecoll-jib-2015-265 | sbgn.af.level-1.version-1.2 |
| AF L1V1.0 | 2009 | sbgn.af.level-1.version-1.0 |
|
| AF L1V1 | sbgn.af.level-1.version-1 |
The version version-1 of a language is the identifier of the latest version 1.x at the time it was registered. The published SBGN-ML schema, which libsbgnpy takes from sbgn/libsbgn, lacks PD L1V2.0 and L1V2.1; libsbgnpy adds both to its schema. PD L1V2.0 is listed by the SBGN-ML 0.3 specification, the identifier of PD L1V2.1 follows the naming of the registry but is not registered yet.
What SBGN-ML 0.3 changed¶
SBGN-ML 0.3 is the format libsbgnpy reads and writes, documents in SBGN-ML 0.1 and 0.2 are upconverted while reading, see Reading and writing. Compared with 0.2:
- a document holds several maps, every map has an
id, - the
versionof a map replaces the deprecatedlanguage, - submaps are supported completely with the
mapRefand thetagRefof a glyph, - the
perturbationof AF is no longer an activity node, but a unit of information of a biological activity; the glyph class is deprecated in AF, - colours and styles are stored as render information in the extension of a map, see Render information.
Glyphs of the latest PD specification in SBGN-ML¶
PD L1V2.0 and L1V2.1 renamed and added glyphs without changing SBGN-ML. They are encoded with the glyph classes which already exist:
| glyph of PD L1V2.x | SBGN-ML |
|---|---|
| empty set (replaces source and sink) | source and sink |
| submap terminal | terminal inside a submap |
| subunit of a complex | a glyph of an entity pool node class inside a complex |
| equivalence operator | equivalence |
| annotation | annotation |
| stoichiometry of a flux arc | cardinality inside the arc |
The shapes, e.g., the stadium of a simple chemical or of a state variable since PD L1V2.0, are a matter of the drawing and not stored in SBGN-ML.
Glyphs and arcs of every language¶
The SBGN-ML schema has a single enumeration of glyph classes and of arc classes for all languages, it does not know which class belongs to which language. GLYPH_CLASSES and ARC_CLASSES hold the classes of the latest specification of every language, auxiliary units such as state variables included. Deprecated classes are still allowed, but logged as a warning.
| class | PD | ER | AF |
|---|---|---|---|
unspecified entity |
✓ | ||
simple chemical |
✓ | ||
macromolecule |
✓ | ||
nucleic acid feature |
✓ | ||
simple chemical multimer |
✓ | ||
macromolecule multimer |
✓ | ||
nucleic acid feature multimer |
✓ | ||
complex |
✓ | ||
complex multimer |
✓ | ||
source and sink |
✓ | ||
perturbation |
deprecated | ||
biological activity |
✓ | ||
perturbing agent |
✓ | ✓ | |
compartment |
✓ | ✓ | |
submap |
✓ | ✓ | |
tag |
✓ | ✓ | |
terminal |
✓ | ✓ | |
process |
✓ | ||
omitted process |
✓ | ||
uncertain process |
✓ | ||
association |
✓ | ||
dissociation |
✓ | ||
phenotype |
✓ | ✓ | ✓ |
and |
✓ | ✓ | ✓ |
or |
✓ | ✓ | ✓ |
not |
✓ | ✓ | ✓ |
equivalence |
✓ | ||
state variable |
✓ | ✓ | |
unit of information |
✓ | ✓ | ✓ |
entity |
✓ | ||
outcome |
✓ | ||
interaction |
✓ | ||
influence target |
✓ | ||
annotation |
✓ | ✓ | ✓ |
variable value |
✓ | ||
implicit xor |
✓ | ||
delay |
✓ | ✓ | |
existence |
✓ | ||
location |
✓ | ||
cardinality |
✓ | ✓ | |
observable |
deprecated | deprecated | deprecated |
| class | PD | ER | AF |
|---|---|---|---|
production |
✓ | ||
consumption |
✓ | ||
catalysis |
✓ | ||
modulation |
✓ | ✓ | |
stimulation |
✓ | ✓ | |
inhibition |
✓ | ✓ | |
assignment |
✓ | ||
interaction |
✓ | ||
absolute inhibition |
✓ | ||
absolute stimulation |
✓ | ||
positive influence |
✓ | ||
negative influence |
✓ | ||
unknown influence |
✓ | ||
equivalence arc |
✓ | ✓ | |
necessary stimulation |
✓ | ✓ | ✓ |
logic arc |
✓ | ✓ | ✓ |
Checking a map¶
check_map and check_sbgn check what the specifications require on top of the schema: a map declares its language with a version or a language, the two agree, and every glyph and every arc has a class of the language of the map. validate combines these checks with the validation against the schema, see Validation:
from libsbgnpy import Bbox, Glyph, GlyphClass, Map, MapLanguage, check_map
map = Map(id="m", language=MapLanguage.PROCESS_DESCRIPTION)
map.glyph.append(
Glyph(
id="g1",
class_value=GlyphClass.BIOLOGICAL_ACTIVITY,
bbox=Bbox(x=0, y=0, w=120, h=60),
)
)
print(check_map(map))
# ["map 'm': glyph 'g1' has the class 'biological activity', which is no glyph class of process description"]
The validation rules of the language specifications, e.g., that a consumption arc connects an entity pool node with a process, are checked by validate_schematron, see Schematron rules.