logo Netzschleuder network catalog, repository, and centrifuge

History of human_interactomes_ndex

The changes to the source code of this entry in the repository, newest first, each with the differences it made to the entry's files. They are also listed on GitLab.

[entries] Add the date when each entry was added, and remove icon_hash by Tiago de Paula Peixoto beff7c9
The dates are those of the commits that first added the entries' files
(2020-08-11 for the entries of the initial commit); renamed entries keep
the date of their first name.

Changed: none
diff --git a/entries/human_interactomes_ndex/__init__.py b/entries/human_interactomes_ndex/__init__.py
index 0693bf5..92df14f 100644
--- a/entries/human_interactomes_ndex/__init__.py
+++ b/entries/human_interactomes_ndex/__init__.py
@@ -59,7 +59,7 @@ citation = [('S. N. Wright, S. Colton, L. V. Schaffer, R. T. Pillich, C. Churas,
              'https://doi.org/10.1016/j.celrep.2023.112873'),
             ('D. Pratt, J. Chen, R. Pillich, V. Rynkov, A. Gary, B. Demchak, T. Ideker, "NDEx 2.0: A Clearinghouse for Research on Cancer Pathways." Cancer Research 77, e58-e61 (2017)',
              'https://doi.org/10.1158/0008-5472.CAN-17-0606')]
-icon_hash = None
+date_added = '2026-10-31'
 # Public networks on NDEx; the networks of Huang et al. are under CC BY-NC
 # 4.0 (their "rights" attribute), those of the BMI study under CC BY-NC-SA
 # 4.0; each source has its own license (most are
[entries] Prefix the properties in the descriptions with (Node), (Edge) or (Graph) by Tiago de Paula Peixoto bc3dbbd
The lists of properties at the end of the descriptions marked edge
properties with "Edge" but left node properties unmarked, or grouped
them in "Nodes: `a`, ...; `b`, ..." items, so the kind of a property
was often unclear. Every item now starts with (Node), (Edge) or (Graph),
followed by the property names, a colon and the explanation, one item
per property or group of properties; qualifications (kinds of nodes,
networks) follow the names in parentheses. Properties that were only
named got a short explanation, and a few items that named the wrong
kind of property were corrected.
diff --git a/entries/human_interactomes_ndex/__init__.py b/entries/human_interactomes_ndex/__init__.py
index 8be0460..0693bf5 100644
--- a/entries/human_interactomes_ndex/__init__.py
+++ b/entries/human_interactomes_ndex/__init__.py
@@ -41,13 +41,14 @@ The direction of the interactions of directed sources (e.g. kinase to substrate
 
 The networks have the following properties:
 
-- `name`: the name of the node in NDEx: the gene symbol (in `pcnet_1.4`, `alzheimers_disease`, `autism_spectrum_disorder` and `bipolar_disorder`, the NCBI Gene identifier; in the systems maps, the name or identifier of the system; in `wright2025_interactome_dependencies`, the short name of the interactome).
-- `represents`: the identifier of the gene in NDEx, e.g. `ncbigene:2` or `hgnc.symbol:A2M` (empty if not given).
-- `entrez_id`: the NCBI Gene identifier of the gene, from `represents`, or from `name` in the networks without `represents` (-1 if it is not an NCBI Gene identifier).
-- Other node attributes, as given in NDEx, e.g. `geneid` (the NCBI Gene identifier), `hgnc_symbol`; in the BMI networks, the network proximity scores `nps_h`, `nps_r`, `nps_hr` (to the human, rat and both GWAS genes) and `human_seed`, `rat_seed` (whether the gene is a GWAS gene); in the systems maps, the member genes and sizes of the systems (e.g. `community_genes`, `community_size`, `hcx_members`), their names, and the fractions of the kinds of genes they contain.
-- Edge `interaction`: the kind of interaction, as given in NDEx (e.g. `interacts-with`).
-- Other edge attributes, as given by each source in NDEx, with their names in lower case and with underscores (e.g. `score`, `experimental_system`, `publication_source`, `supporting_databases`; columns named only by their number in the source file are named `column_<number>`); missing values are empty, -1 or NaN.
-- Graph `ndex_uuid`: the identifier of the network in NDEx; `ndex_<attribute>`: the attributes of the network in NDEx, e.g. `ndex_name`, `ndex_version`, `ndex_description`, `ndex_reference`, `ndex_prov_wasderivedfrom` (the source of the data)."""
+- (Node) `name`: the name of the node in NDEx: the gene symbol (in `pcnet_1.4`, `alzheimers_disease`, `autism_spectrum_disorder` and `bipolar_disorder`, the NCBI Gene identifier; in the systems maps, the name or identifier of the system; in `wright2025_interactome_dependencies`, the short name of the interactome).
+- (Node) `represents`: the identifier of the gene in NDEx, e.g. `ncbigene:2` or `hgnc.symbol:A2M` (empty if not given).
+- (Node) `entrez_id`: the NCBI Gene identifier of the gene, from `represents`, or from `name` in the networks without `represents` (-1 if it is not an NCBI Gene identifier).
+- (Node) Other attributes, as given in NDEx, e.g. `geneid` (the NCBI Gene identifier), `hgnc_symbol`; in the BMI networks, the network proximity scores `nps_h`, `nps_r`, `nps_hr` (to the human, rat and both GWAS genes) and `human_seed`, `rat_seed` (whether the gene is a GWAS gene); in the systems maps, the member genes and sizes of the systems (e.g. `community_genes`, `community_size`, `hcx_members`), their names, and the fractions of the kinds of genes they contain.
+- (Edge) `interaction`: the kind of interaction, as given in NDEx (e.g. `interacts-with`).
+- (Edge) Other attributes, as given by each source in NDEx, with their names in lower case and with underscores (e.g. `score`, `experimental_system`, `publication_source`, `supporting_databases`; columns named only by their number in the source file are named `column_<number>`); missing values are empty, -1 or NaN.
+- (Graph) `ndex_uuid`: the identifier of the network in NDEx.
+- (Graph) `ndex_<attribute>`: the attributes of the network in NDEx, e.g. `ndex_name`, `ndex_version`, `ndex_description`, `ndex_reference`, `ndex_prov_wasderivedfrom` (the source of the data)."""
 tags = ['Biological', 'Protein interactions', 'Unweighted', 'Metadata']
 url = ['https://www.ndexbio.org/', 'https://www.ndexbio.org/#/user/7b97c33f-4673-11ed-b7d0-0ac135e8bacf']
 citation = [('S. N. Wright, S. Colton, L. V. Schaffer, R. T. Pillich, C. Churas, D. Pratt, T. Ideker, "State of the interactomes: an evaluation of molecular networks for generating biological insights." Molecular Systems Biology 21, 1-29 (2025)',
[entries] New entry: human_interactomes_ndex by Tiago de Paula Peixoto 2cca4b4
diff --git a/entries/human_interactomes_ndex/__init__.py b/entries/human_interactomes_ndex/__init__.py
new file mode 100644
index 0000000..8be0460
--- /dev/null
+++ b/entries/human_interactomes_ndex/__init__.py
@@ -0,0 +1,404 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2026 Tiago de Paula Peixoto <tiago@skewed.de>
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Affero General Public License along
+# with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import json
+import re
+
+from .. import *
+
+title = "Molecular interaction networks of two benchmark collections and related studies (NDEx, 2017-2025)"
+description = r"""Networks of human genes (or their protein products; a few networks are of other species) from many databases of molecular interactions, from the two collections of harmonized networks used to evaluate how well molecular networks recover disease genes and other biological knowledge, by Huang et al. (2018) and by Wright et al. ("State of the interactomes", 2025), both from the Ideker lab, and deposited on the Network Data Exchange (NDEx). In each network, the nodes are genes (the interactions of the sources were mapped to them), identified by their NCBI Gene identifiers in the networks of Wright et al. and by their HGNC symbols in those of Huang et al., and an edge is an interaction or functional association between two genes, with the attributes given by the source (e.g. scores, evidence, publications). The sources are of many kinds: curated protein-protein interactions (e.g. BioGRID, IntAct, HPRD, DIP, MINT), systematic screens (e.g. HuRI, BioPlex, Hein, Youn, Havugimana, Wan, ProteomeHD), integrated and predicted interactions (e.g. STRING, HumanNet, GeneMANIA, GIANT, FunCoup, ConsensusPathDB, HIPPIE, iRefIndex, IID, Mentha, APID, InBioMap, PrePPI, hu.MAP), pathways and signaling (e.g. Reactome, ReactomeFI, PathwayCommons, PID, SIGNOR, SignaLink, SPIKE, PhosphoSitePlus), and regulation (TFLink); and the Parsimonious Composite Networks (PCNet) built by the authors from the networks that perform best, keeping the interactions supported by at least two of them.
+
+The networks are named by the collection and the source:
+
+- `huang2018_<source>`: the 21 networks evaluated by Huang et al. (versions of 2017), with the composite networks `huang2018_full_composite` (the union of all of them) and `huang2018_pcnet` (PCNet 1.0), and two variants without text-mined interactions (`huang2018_humannet_no_textmining`, `huang2018_string_no_textmining`). These networks have no edge attributes.
+- `pcnet_1.1`, `pcnet_1.2`, `pcnet_1.3`, `pcnet_1.4`: later versions of PCNet, with updated gene identifiers.
+- `wright2025_<source>`: the 45 networks of the sources evaluated by Wright et al. (versions of 2016-2024), with the composite networks `wright2025_pcnet_2.0`, `wright2025_pcnet_2.1` and `wright2025_pcnet_2.2`, and the variants `wright2025_string_cocitation_free` and `wright2025_humannet_cocitation_free` without the interactions supported only by co-citation.
+- `wright2025_interactome_dependencies`: the small directed network of the dependencies between the interactomes evaluated by Wright et al.: the nodes are the interactomes, and an edge goes from an interactome to each interactome whose data it incorporates (the edge attributes `source` and `target` give the full names of the incorporated and of the incorporating interactome, and `source_category` and `category` their kinds).
+
+The same authors deposited networks of other species and of specific studies, which are also included:
+
+- `pcnet_mouse`, `pcnet_rat`: PCNet (NDEx version 1.1) mapped to the genes of mouse and rat with the HCOP orthology database; `string_fly`: STRING of the fruit fly (with the combined score as edge `weight`); `string_11.5_rat_all`, `string_11.5_rat_mid`, `string_11.5_rat_high`: STRING v11.5 of the rat, with all links, and with those of combined score above 400 (medium confidence) and 700 (high confidence). The nodes of these networks are named by the gene symbols of the species.
+- `wright2023_bmi_*`: the networks of the study of the body mass index (BMI) of Wright et al. (2023), subnetworks of PCNet 1.3 of the genes near the genes of the genome-wide association studies (GWAS) of BMI in humans and rats, found by network propagation (network colocalization, NetColoc): `wright2023_bmi_conserved` (genes near the GWAS genes of both species), `wright2023_bmi_human_specific`, `wright2023_bmi_rat_specific` (near those of one species but not the other) and `wright2023_bmi_expanded` (near those of either species); and the directed hierarchies of gene systems (communities found with HiDeF, named by enriched GO terms) of the conserved and the expanded network, `wright2023_bmi_conserved_systems_map` and `wright2023_bmi_expanded_systems_map`, whose nodes are the systems, with an edge from each system to its subsystems.
+- `alzheimers_disease`, `autism_spectrum_disorder`, `bipolar_disorder` (NDEx user snwright, 2025): networks of the genes near the genes of common and of rare variants associated with Alzheimer's disease, autism spectrum disorder and bipolar disorder, found by network colocalization (unlisted networks on NDEx, linked from their systems maps); and their directed hierarchies of gene systems `alzheimers_disease_systems_map`, `autism_spectrum_disorder_systems_map`, `bipolar_disorder_systems_map`, whose nodes are the systems, with their member genes (`hcx_members`, NCBI Gene identifiers; `hgnc`, gene symbols), and with an edge from each system to the larger system that contains it (as stored in NDEx).
+
+The direction of the interactions of directed sources (e.g. kinase to substrate in PhosphoSitePlus, transcription factor to target in TFLink) is kept as the order of the two ends of the edges, but the interaction networks are undirected; only the systems maps and `wright2025_interactome_dependencies` are directed. The attributes `name` (e.g. `A2M_APP`) and `Entrez_A`, `Entrez_B` of the edges, which repeat the genes of the edge, are left out.
+
+The networks have the following properties:
+
+- `name`: the name of the node in NDEx: the gene symbol (in `pcnet_1.4`, `alzheimers_disease`, `autism_spectrum_disorder` and `bipolar_disorder`, the NCBI Gene identifier; in the systems maps, the name or identifier of the system; in `wright2025_interactome_dependencies`, the short name of the interactome).
+- `represents`: the identifier of the gene in NDEx, e.g. `ncbigene:2` or `hgnc.symbol:A2M` (empty if not given).
+- `entrez_id`: the NCBI Gene identifier of the gene, from `represents`, or from `name` in the networks without `represents` (-1 if it is not an NCBI Gene identifier).
+- Other node attributes, as given in NDEx, e.g. `geneid` (the NCBI Gene identifier), `hgnc_symbol`; in the BMI networks, the network proximity scores `nps_h`, `nps_r`, `nps_hr` (to the human, rat and both GWAS genes) and `human_seed`, `rat_seed` (whether the gene is a GWAS gene); in the systems maps, the member genes and sizes of the systems (e.g. `community_genes`, `community_size`, `hcx_members`), their names, and the fractions of the kinds of genes they contain.
+- Edge `interaction`: the kind of interaction, as given in NDEx (e.g. `interacts-with`).
+- Other edge attributes, as given by each source in NDEx, with their names in lower case and with underscores (e.g. `score`, `experimental_system`, `publication_source`, `supporting_databases`; columns named only by their number in the source file are named `column_<number>`); missing values are empty, -1 or NaN.
+- Graph `ndex_uuid`: the identifier of the network in NDEx; `ndex_<attribute>`: the attributes of the network in NDEx, e.g. `ndex_name`, `ndex_version`, `ndex_description`, `ndex_reference`, `ndex_prov_wasderivedfrom` (the source of the data)."""
+tags = ['Biological', 'Protein interactions', 'Unweighted', 'Metadata']
+url = ['https://www.ndexbio.org/', 'https://www.ndexbio.org/#/user/7b97c33f-4673-11ed-b7d0-0ac135e8bacf']
+citation = [('S. N. Wright, S. Colton, L. V. Schaffer, R. T. Pillich, C. Churas, D. Pratt, T. Ideker, "State of the interactomes: an evaluation of molecular networks for generating biological insights." Molecular Systems Biology 21, 1-29 (2025)',
+             'https://doi.org/10.1038/s44320-024-00077-y'),
+            ('J. K. Huang, D. E. Carlin, M. K. Yu, W. Zhang, J. F. Kreisberg, P. Tamayo, T. Ideker, "Systematic Evaluation of Molecular Networks for Discovery of Disease Genes." Cell Systems 6, 484-495 (2018)',
+             'https://doi.org/10.1016/j.cels.2018.03.001'),
+            ('S. N. Wright, B. S. Leger, S. B. Rosenthal, S. N. Liu, T. Jia, A. S. Chitre, O. Polesskaya, K. Holl, J. Gao, R. Cheng, A. Garcia Martinez, A. George, A. F. Gileta, W. Han, A. H. Netzley, C. P. King, A. Lamparelli, C. Martin, C. L. St. Pierre, T. Wang, H. Bimschleger, J. Richards, K. Ishiwari, H. Chen, S. B. Flagel, P. Meyer, T. E. Robinson, L. C. Solberg Woods, J. F. Kreisberg, T. Ideker, A. A. Palmer, "Genome-wide association studies of human and rat BMI converge on synapse, epigenome, and hormone signaling networks." Cell Reports 42, 112873 (2023)',
+             'https://doi.org/10.1016/j.celrep.2023.112873'),
+            ('D. Pratt, J. Chen, R. Pillich, V. Rynkov, A. Gary, B. Demchak, T. Ideker, "NDEx 2.0: A Clearinghouse for Research on Cancer Pathways." Cancer Research 77, e58-e61 (2017)',
+             'https://doi.org/10.1158/0008-5472.CAN-17-0606')]
+icon_hash = None
+# Public networks on NDEx; the networks of Huang et al. are under CC BY-NC
+# 4.0 (their "rights" attribute), those of the BMI study under CC BY-NC-SA
+# 4.0; each source has its own license (most are
+# open, e.g. CC BY; some only for non-commercial use, e.g. InBioMap,
+# ConsensusPathDB, HPRD, PhosphoSitePlus)
+upstream_license = ('The licenses of the source databases (open for most; non-commercial use for some); networks of Huang et al.: CC BY-NC 4.0; BMI study: CC BY-NC-SA 4.0',
+                    'https://www.ndexbio.org/')
+upstream_prefix = 'https://www.ndexbio.org/v3/networks'
+
+# NDEx network UUIDs (which pin the versions) and the names of the networks
+NETWORKS = {
+    # Huang et al. (2018), NDEx user jkhuang
+    "04471cb3-86d3-11e7-a10d-0ac135e8bacf": "huang2018_bind",
+    "becec556-86d4-11e7-a10d-0ac135e8bacf": "huang2018_biogrid",
+    "c060aff9-86d4-11e7-a10d-0ac135e8bacf": "huang2018_bioplex",
+    "1a9d6d0f-86d5-11e7-a10d-0ac135e8bacf": "huang2018_consensuspathdb",
+    "1c363581-86d5-11e7-a10d-0ac135e8bacf": "huang2018_dip",
+    "edaec0cb-86d8-11e7-a10d-0ac135e8bacf": "huang2018_full_composite",
+    "08ba2a31-86da-11e7-a10d-0ac135e8bacf": "huang2018_giant",
+    "a5d6eb0e-86d9-11e7-a10d-0ac135e8bacf": "huang2018_genemania",
+    "0f92ca13-86da-11e7-a10d-0ac135e8bacf": "huang2018_hint",
+    "1093e665-86da-11e7-a10d-0ac135e8bacf": "huang2018_hprd",
+    "110ce6f7-86da-11e7-a10d-0ac135e8bacf": "huang2018_humaninteractome",
+    "18dc9109-86da-11e7-a10d-0ac135e8bacf": "huang2018_humannet",
+    "24483fc5-86d5-11e7-a10d-0ac135e8bacf": "huang2018_humannet_no_textmining",
+    "2ca3bcf6-86da-11e7-a10d-0ac135e8bacf": "huang2018_irefindex",
+    "266efe30-86da-11e7-a10d-0ac135e8bacf": "huang2018_inbiomap",
+    "295ef233-86da-11e7-a10d-0ac135e8bacf": "huang2018_intact",
+    "326806a9-86da-11e7-a10d-0ac135e8bacf": "huang2018_mentha",
+    "359bba6c-86da-11e7-a10d-0ac135e8bacf": "huang2018_multinet",
+    "47eb8891-86da-11e7-a10d-0ac135e8bacf": "huang2018_pid",
+    "f93f402c-86d4-11e7-a10d-0ac135e8bacf": "huang2018_pcnet",
+    "46b63cdf-86da-11e7-a10d-0ac135e8bacf": "huang2018_pathwaycommons",
+    "4bc71515-86da-11e7-a10d-0ac135e8bacf": "huang2018_reactome",
+    "50cddb28-86da-11e7-a10d-0ac135e8bacf": "huang2018_reactomefi",
+    "cfcd4cdb-86da-11e7-a10d-0ac135e8bacf": "huang2018_string",
+    "959fe798-86d5-11e7-a10d-0ac135e8bacf": "huang2018_string_no_textmining",
+    # later versions of PCNet (NDEx users t1jia and snwright)
+    "4164974c-f8cf-11e8-8438-0ac135e8bacf": "pcnet_1.1",
+    "f0e9592f-5669-11e9-9f06-0ac135e8bacf": "pcnet_1.2",
+    "4de852d9-9908-11e9-bcaf-0ac135e8bacf": "pcnet_1.3",
+    "c3554b4e-8c81-11ed-a157-005056ae23aa": "pcnet_1.4",
+    # PCNet mapped to mouse and rat with HCOP, and STRING of the fly (NDEx
+    # user t1jia)
+    "910589f7-990b-11e9-bcaf-0ac135e8bacf": "pcnet_mouse",
+    "90c7d2cc-990d-11e9-bcaf-0ac135e8bacf": "pcnet_rat",
+    "3e55390b-9a04-11e9-be49-0ac135e8bacf": "string_fly",
+    # STRING v11.5 of the rat and the networks of the BMI study of Wright et
+    # al. (2023), NDEx user snwright
+    "85cf5eca-f5ad-11ec-ac45-0ac135e8bacf": "string_11.5_rat_all",
+    "8d9a26de-f5ad-11ec-ac45-0ac135e8bacf": "string_11.5_rat_mid",
+    "880c7d8c-f5ad-11ec-ac45-0ac135e8bacf": "string_11.5_rat_high",
+    "bdc44778-2b18-11ed-ac45-0ac135e8bacf": "wright2023_bmi_conserved",
+    "e6c0e0df-abab-11ec-b3be-0ac135e8bacf": "wright2023_bmi_human_specific",
+    "e00a960c-abab-11ec-b3be-0ac135e8bacf": "wright2023_bmi_rat_specific",
+    "3eb1be27-a66f-11ed-9a1f-005056ae23aa": "wright2023_bmi_expanded",
+    "df1a8fab-2b19-11ed-ac45-0ac135e8bacf": "wright2023_bmi_conserved_systems_map",
+    "5ff2a71a-2b1c-11ed-ac45-0ac135e8bacf": "wright2023_bmi_expanded_systems_map",
+    # networks of genes of common and rare variants of three diseases and
+    # their systems maps (NDEx user snwright, 2025; the networks are
+    # "unlisted", linked from the maps)
+    "557cbb75-4eda-11f0-a218-005056ae3c32": "alzheimers_disease",
+    "63e1e753-4ee2-11f0-a218-005056ae3c32": "autism_spectrum_disorder",
+    "7171c4ba-4edf-11f0-a218-005056ae3c32": "bipolar_disorder",
+    "e5210733-4ed6-11f0-a218-005056ae3c32": "alzheimers_disease_systems_map",
+    "d4e2d911-4ee1-11f0-a218-005056ae3c32": "autism_spectrum_disorder_systems_map",
+    "087230d8-4edf-11f0-a218-005056ae3c32": "bipolar_disorder_systems_map",
+    # Wright et al. (2025), NDEx user pcnet2
+    "a66de8d6-f137-11ee-9621-005056ae23aa": "wright2025_apid",
+    "8c07a39d-f137-11ee-9621-005056ae23aa": "wright2025_bind",
+    "eba1723f-f139-11ee-9621-005056ae23aa": "wright2025_biogrid",
+    "9881c2f3-f137-11ee-9621-005056ae23aa": "wright2025_bioplex_293t",
+    "92ab9ef0-f137-11ee-9621-005056ae23aa": "wright2025_bioplex_hct116",
+    "0a4fb7b9-f1f2-11ee-9621-005056ae23aa": "wright2025_comppi",
+    "a6d0dcb9-f144-11ee-9621-005056ae23aa": "wright2025_consensuspathdb",
+    "f1bbca31-f139-11ee-9621-005056ae23aa": "wright2025_dip",
+    "b9b6796c-f138-11ee-9621-005056ae23aa": "wright2025_funcoup",
+    "264b98f1-f145-11ee-9621-005056ae23aa": "wright2025_giant",
+    "d51822b5-f13a-11ee-9621-005056ae23aa": "wright2025_genemania",
+    "ca12f69b-f142-11ee-9621-005056ae23aa": "wright2025_hint",
+    "b6e3bdd1-f145-11ee-9621-005056ae23aa": "wright2025_hippie",
+    "7ecc2716-f145-11ee-9621-005056ae23aa": "wright2025_hprd",
+    "a3715364-f143-11ee-9621-005056ae23aa": "wright2025_havugimana",
+    "fb1b3097-f143-11ee-9621-005056ae23aa": "wright2025_hein",
+    "7f1eb3e8-f145-11ee-9621-005056ae23aa": "wright2025_huri",
+    "db921c7d-f144-11ee-9621-005056ae23aa": "wright2025_humannet",
+    "d828d9cb-f144-11ee-9621-005056ae23aa": "wright2025_humannet_cocitation_free",
+    "1ddd0190-f143-11ee-9621-005056ae23aa": "wright2025_iid",
+    "ac0d3c5f-f145-11ee-9621-005056ae23aa": "wright2025_inbiomap",
+    "134cbb7d-f144-11ee-9621-005056ae23aa": "wright2025_innatedb",
+    "2bdce122-f144-11ee-9621-005056ae23aa": "wright2025_intact",
+    "7f86eb9a-f145-11ee-9621-005056ae23aa": "wright2025_mint",
+    "0e2d645a-f144-11ee-9621-005056ae23aa": "wright2025_matrixdb",
+    "9ca65d5c-f145-11ee-9621-005056ae23aa": "wright2025_mentha",
+    "2ad05320-f144-11ee-9621-005056ae23aa": "wright2025_multinet",
+    "d73d6357-e87b-11ee-9621-005056ae23aa": "wright2025_pcnet_2.0",
+    "e9c574f4-e87a-11ee-9621-005056ae23aa": "wright2025_pcnet_2.1",
+    "8b4b54fa-e87d-11ee-9621-005056ae23aa": "wright2025_pcnet_2.2",
+    "e2875a4d-f146-11ee-9621-005056ae23aa": "wright2025_pid_2.0",
+    "e542a9c4-f146-11ee-9621-005056ae23aa": "wright2025_pips",
+    "2a208e9b-f148-11ee-9621-005056ae23aa": "wright2025_proper",
+    "0de69a1b-f1f2-11ee-9621-005056ae23aa": "wright2025_ptmcode2",
+    "fdf4369e-f142-11ee-9621-005056ae23aa": "wright2025_pathwaycommons",
+    "b3844648-f142-11ee-9621-005056ae23aa": "wright2025_phosphositeplus",
+    "e923db99-f146-11ee-9621-005056ae23aa": "wright2025_preppi",
+    "15ee6be5-f148-11ee-9621-005056ae23aa": "wright2025_proteomehd",
+    "e4e5e3c2-f146-11ee-9621-005056ae23aa": "wright2025_reactome",
+    "30d2458d-f148-11ee-9621-005056ae23aa": "wright2025_reactomefi",
+    "0ee83d7e-f1f0-11ee-9621-005056ae23aa": "wright2025_signor",
+    "4d360871-f148-11ee-9621-005056ae23aa": "wright2025_spike",
+    "5f5da339-f14a-11ee-9621-005056ae23aa": "wright2025_string",
+    "e22d56cc-f14a-11ee-9621-005056ae23aa": "wright2025_string_cocitation_free",
+    "06deca0f-f147-11ee-9621-005056ae23aa": "wright2025_signalink",
+    "8c109eb7-f149-11ee-9621-005056ae23aa": "wright2025_tflink",
+    "18c1d738-f148-11ee-9621-005056ae23aa": "wright2025_wan",
+    "f2093b6c-f146-11ee-9621-005056ae23aa": "wright2025_youn",
+    "e8f8e5bf-f144-11ee-9621-005056ae23aa": "wright2025_humap",
+    "4cda9e86-f144-11ee-9621-005056ae23aa": "wright2025_irefindex",
+    "3d5a8d55-961c-11ef-af07-005056ae3c32": "wright2025_interactome_dependencies",
+}
+
+# Networks whose edges have a direction: the hierarchies of the systems maps
+# (from a system to its subsystems) and the dependencies between the
+# interactomes (from a source to the interactome that incorporates it)
+DIRECTED = {alt for alt in NETWORKS.values()
+            if alt.endswith("_systems_map")} | {"wright2025_interactome_dependencies"}
+files = [(uuid, alt, None) for uuid, alt in NETWORKS.items()]
+
+def fetch_upstream(force=False):
+    return fetch_upstream_files(__name__.split(".")[-1], upstream_prefix, files,
+                                force)
+
+class CXReader:
+    """A streaming reader of a CX2 document (a JSON array of aspects, each an
+    object with a single key, whose value is usually a list of elements),
+    which yields (aspect, element) pairs without loading the whole document
+    (the lists of edges can have millions of elements)."""
+
+    def __init__(self, f, chunk=1 << 24):
+        self.f = f
+        self.chunk = chunk
+        self.buf = ""
+        self.pos = 0
+        self.eof = False
+        self.dec = json.JSONDecoder()
+
+    def fill(self):
+        if self.eof:
+            return False
+        data = self.f.read(self.chunk)
+        if not data:
+            self.eof = True
+            return False
+        self.buf = self.buf[self.pos:] + data
+        self.pos = 0
+        return True
+
+    def skip_ws(self):
+        while True:
+            while self.pos < len(self.buf) and self.buf[self.pos] in " \t\r\n":
+                self.pos += 1
+            if self.pos < len(self.buf) or not self.fill():
+                return
+
+    def peek(self):
+        self.skip_ws()
+        if self.pos >= len(self.buf):
+            raise ValueError("unexpected end of the CX document")
+        return self.buf[self.pos]
+
+    def expect(self, c):
+        x = self.peek()
+        if x != c:
+            raise ValueError(f"expected {c!r}, found {self.buf[self.pos:self.pos + 50]!r}")
+        self.pos += 1
+
+    def value(self):
+        self.skip_ws()
+        while True:
+            try:
+                x, end = self.dec.raw_decode(self.buf, self.pos)
+                # a number at the end of the buffer may be incomplete
+                if end < len(self.buf) or self.eof:
+                    self.pos = end
+                    return x
+            except json.JSONDecodeError:
+                if self.eof:
+                    raise
+            if not self.fill():
+                x, self.pos = self.dec.raw_decode(self.buf, self.pos)
+                return x
+
+    def __iter__(self):
+        self.expect("[")
+        if self.peek() == "]":
+            return
+        while True:
+            self.expect("{")
+            while True:
+                key = self.value()
+                self.expect(":")
+                if self.peek() == "[":
+                    self.pos += 1
+                    if self.peek() != "]":
+                        while True:
+                            yield key, self.value()
+                            if self.peek() == ",":
+                                self.pos += 1
+                                continue
+                            break
+                    self.expect("]")
+                else:
+                    yield key, self.value()
+                if self.peek() == ",":
+                    self.pos += 1
+                    continue
+                break
+            self.expect("}")
+            if self.peek() == ",":
+                self.pos += 1
+                continue
+            break
+        self.expect("]")
+
+# for checks: stop after this many edges per network (None: all)
+_check_rows = None
+
+# Edge attributes that repeat the genes of the edge
+SKIP_EATTRS = {"name", "Entrez_A", "Entrez_B"}
+
+def pname(name):
+    "The name of a property for the attribute `name` of NDEx."
+    name = re.sub(r"^\d+:", "", name)
+    s = re.sub(r"[^0-9a-z]+", "_", name.lower()).strip("_")
+    if s.isdigit():
+        s = f"column_{s}"
+    return s or "attribute"
+
+TYPES = {"string": "string", "integer": "int64_t", "long": "int64_t",
+         "double": "double", "boolean": "bool",
+         "list_of_string": "vector<string>", "list_of_integer": "vector<int64_t>",
+         "list_of_long": "vector<int64_t>", "list_of_double": "vector<double>",
+         "list_of_boolean": "vector<bool>"}
+
+def missing(t):
+    if t.startswith("vector"):
+        return []
+    return {"string": "", "int64_t": -1, "double": numpy.nan, "bool": False}[t]
+
+def convert(x, t):
+    if x is None:
+        return missing(t)
+    if t == "string":
+        return x if isinstance(x, str) else json.dumps(x)
+    if t.startswith("vector"):
+        return x if isinstance(x, list) else [x]
+    if t == "double":
+        return float(x)
+    if t == "int64_t":
+        return int(x)
+    return bool(x)
+
+@cache_network()
+@coerce_props()
+@annotate()
+def parse(alts=None):
+    name = __name__.split(".")[-1]
+    for uuid, alt in NETWORKS.items():
+        if alts is not None and alt not in alts:
+            continue
+        decl = {"nodes": {}, "edges": {}}
+        netattrs = {}
+        vidx = {}
+        vattrs = []
+        src, tgt = [], []
+        ecols = None
+        # attribute names and types, with the aliases used in the elements
+        def attributes(kind):
+            out = {}
+            for k, d in decl[kind].items():
+                if kind == "edges" and k in SKIP_EATTRS:
+                    continue
+                out[d.get("a", k)] = (k, TYPES[d.get("d", "string")])
+            return out
+        with open_upstream_file(name, uuid, "r") as f:
+            for aspect, el in CXReader(f):
+                if aspect == "attributeDeclarations":
+                    # (they precede the nodes and edges in CX2)
+                    assert ecols is None
+                    for k in ("nodes", "edges"):
+                        decl[k].update(el.get(k, {}))
+                elif aspect == "networkAttributes":
+                    netattrs.update(el)
+                elif aspect == "nodes":
+                    assert el["id"] not in vidx, el
+                    vidx[el["id"]] = len(vidx)
+                    vattrs.append(el.get("v", {}))
+                elif aspect == "edges":
+                    if _check_rows is not None and len(src) >= _check_rows:
+                        break
+                    if ecols is None:
+                        eatts = attributes("edges")
+                        ecols = {a: [] for a in eatts}
+                    src.append(el["s"])
+                    tgt.append(el["t"])
+                    v = el.get("v", {})
+                    for a, col in ecols.items():
+                        col.append(convert(v.get(a), eatts[a][1]))
+                elif aspect == "status":
+                    assert el.get("success", True), el
+        g = Graph(directed=alt in DIRECTED)
+        g.add_vertex(len(vidx))
+        vmap = numpy.full(max(vidx) + 1 if vidx else 0, -1, dtype="int64")
+        for i, j in vidx.items():
+            vmap[i] = j
+        g.add_edge_list(numpy.column_stack([vmap[numpy.array(src, dtype="int64")],
+                                            vmap[numpy.array(tgt, dtype="int64")]]))
+        del src, tgt
+        vatts = attributes("nodes")
+        for a, (k, t) in vatts.items():
+            g.vp[pname(k)] = g.new_vp(t, vals=[convert(v.get(a), t) for v in vattrs])
+        ids = []
+        rep = next((a for a, (k, t) in vatts.items() if k == "represents"), None)
+        if rep is None and "name" in decl["nodes"]:
+            # without `represents`, the names may be NCBI Gene identifiers
+            # (e.g. in pcnet_1.4)
+            rep = decl["nodes"]["name"].get("a", "name")
+        for v in vattrs:
+            r = str(v.get(rep, "")) if rep is not None else ""
+            ids.append(int(r.removeprefix("ncbigene:"))
+                       if r.removeprefix("ncbigene:").isdigit() else -1)
+        g.vp.entrez_id = g.new_vp("int64_t", vals=ids)
+        del vattrs
+        for a, col in (ecols or {}).items():
+            k, t = eatts[a]
+            g.ep[pname(k)] = g.new_ep(t, vals=col)
+            ecols[a] = None
+        g.gp.ndex_uuid = g.new_gp("string", val=uuid)
+        for k, x in netattrs.items():
+            k = f"ndex_{pname(k)}"
+            if k not in g.gp:
+                g.gp[k] = g.new_gp("string", val=x if isinstance(x, str) else json.dumps(x))
+        yield alt, g