RSSAmplifier

Blog

Biopragmatics

Unraveling complex biology with biological knowledge graphs. Content licensed under CC BY 4.0.

cthoyt.comRSS feed ↗105 posts

Latest posts

Mapping from SSSOM to OWL

The Simple Standard for Sharing Ontological Mappings (SSSOM) specifies a transformation from its data model to the to Web Ontology Language (OWL) its documentation. This post is about implementing and extending that transformation in the sssom-pydantic Python package and the implications for ontology curation and maintenance, especially within the context of NFDI4Chem.

Standards Don’t Succeed Without Community Work

In March 2026, the NIH Common Fund Data Ecosystem issued a request for comments for a proposal for a knowledge graph exchange format entitled JSON Knowledge Graph Exchange Format (JKG). This post is about the burden of proposing yet another standard and highlights sage wisdom from Nico Matentzoglu about the importance of community work in pushing standards.

LLM Notes and Policies

Generative artificial intelligence, large language models (LLMs), and agentic artificial intelligence have become unavoidable topics of conversation for programmers and scientists alike. This post comprises links to external writing about these topics from which I would like to draw inspiration when crafting my own communication and policies.

Comparing manually curated semantic mappings in SSSOM

I am currently supporting Philip Strömert and Noura Rayya in the efforts to modernize and revitalize the Chemical Methods Ontology (CHMO) to support annotation of instrumentation used to produce experimental data captured in the Chemotion electronic laboratory notebook as part of NFDIChem. This post is about the adoption of Simple Standard for Sharing Ontological Mappings (SSSOM) to support…

A practical approach to translate OWL to SKOS

The data model in PyOBO closely resembles the Web Ontology Language (OWL) and macros in the OBO Flat File format. However, some communities prefer the simplified nature of the SKOS data model compared to the highly precise (and sometimes burdensome) nature of OWL semantics. This post describes the workflow I implemented to downscale OWL to SKOS.

Transparent provenance for derived semantic mappings in SSSOM

The Simple Standard for Sharing Ontological Mappings (SSSOM) requires semantic mappings to annotate a justification from the Semantic Mapping Vocabulary (SEMAPV) such as semapv:ManualMappingCuration, semapv:MappingInversion, and semapv:MappingChaining. However, SSSOM did not have a mechanism for tracking which mappings were used during inference workflows like inversion or chaining. This post is…

Discussions at the 7th NFDI4Chem Consortium Meeting

The 7th NFDI4Chem consortium meeting took place last week in Jena. This post is a summary of some of the interesting discussions I had there.

International Society of Biocuration Presents: Curate This!

While researchers typically communicate their work through poster presentations, oral presentations, and written communication, programmers often give (live) demonstrations. I’m not aware of any technical nor practical barriers for why curators couldn’t do the same, and always wished that curators did this more often. This post is about how I planned to make this a reality by starting a podcast…

Efficient Bulk Access to Citations in OpenCitations

OpenCitations aggregates and deduplicates bibliographic information from CrossRef, Europe PubMed Central, and other sources to construct a comprehensive, open index of citations between scientific works. This post describes the opencitations-client package which wraps the OpenCitations API and implements an automated pipeline for locally downloading, caching, and accessing OpenCitations in bulk.

Challenges with Semantic Mappings

There are many challenges associated with the curation, publication, acquisition, and usage of semantic mappings. This post examines their philosophical, technical, and practical implications, highlights existing solutions, and describes opportunities for next steps for the community of curators, semantic engineers, software developers, and data scientists who make and use semantic mappings.

Semantic Mappings Enable Automated Assembly

Data and knowledge originating from heterogeneous sources often use heterogeneous controlled vocabularies and/or ontologies for annotating named entities. Semantic mappings are essential towards resolving these discrepancies and integrating in a coherent way. This post highlights how this looks in two scenarios: when constructing a knowledge graph for graph machine learning and when constructing a…

Mapping from SSSOM to JSKOS

JSKOS (JSON for Knowledge Organization Systems) is a JSON-based data model for representing terminologies, thesauri, classifications, and other semantic artifacts. Like the Simple Standard for Sharing Ontological Mappings (SSSOM), it can also encode semantic mappings. This post is about developing and implementing a crosswalk between them in the sssom-pydantic Python package.

Mapping from SSSOM to Wikidata

At the 4th Ontologies4Chem Workshop in Limburg an der Lahn, I proposed an initial crosswalk between the Simple Standard for Sharing Ontological Mappings (SSSOM) and the Wikidata semantic mapping data model. This post describes the motivation for this proposal and the concrete implementation I’ve developed in sssom-pydantic.

Validating Prefix Maps in LinkML Schemas

LinkML enables defining data models and data schemas in YAML informed by semantic web best practices. As such, each definition includes a prefix map. Similarly to my previous posts on validating the prefix maps appearing in Turtle files and in unfamiliar SPARQL endpoints, this post showcases describes a new extension to the Bioregistry that validates prefix maps in LinkML definitions.

Books I Read in 2025

Here are the books I read in 2025. My goals for the year were to get some more variety, and I think I managed that.

Annotating the Literature with Named Entity Recognition

Annotating the literature with mentions of key concepts from a given domain is often the first step towards extracting more substantial structured knowledge. This can be challenging, as it typically encompasses acquiring and processing the relevant literature and ontologies then installing and applying difficult-to-use named entity recognition (NER) workflows. This post highlights software…

Machine-Actionable Training Materials at BioHackathon Germany 2025

I recently attended the 4th BioHackathon Germany hosted by the German Network for Bioinformatics Infrastructure (de.NBI). I participated in the project On the Path to Machine-actionable Training Materials in order to improve the interoperability between DALIA, TeSS, mTeSS-X, and Schema.org. This post gives a summary of the activities leading up to the hackathon and the results of our happy…

Extracting Semantic Mappings from BioPortal in SSSOM

Earlier this week, a question was asked on OBO Foundry Slack on where to find semantic mappings to terms in the Systematized Nomenclature of Medicine - Clinical Terms (SNOMED-CT). While some are available in the SeMRA Disease Mappings Database, there are many more available within BioPortal, which has access to the entire SNOMED-CT source data and has produced semantic mapping predictions using…

Databases as Ontologies Part 1 - Background and Software

This is the first of a two-part post about encoding databases as ontologies. In this post, I give a background on the problems in biocuration that led me to start encoding databases as ontologies, the software I have written to do it, and the repository I have created to store the resulting artifacts in a FAIR, open, and sustainable way. See also the second part which describes how I applied these…

Databases as Ontologies Part 2 - A Case Study with HGNC

This is the second of a two-part post about encoding databases as ontologies. In the first part, I gave a background on how I started working on this problem and the software stack I developed along the way. In this post, I explain the philosophy and design about how I encoded the HGNC (HUGO Gene Nomenclature Committee) database as an ontology using PyOBO.

Bridging NFDI’s culture and chemistry knowledge graphs

At the sixth NFDI4Chem consortium meeting, Torsten Schrade from the NFDI4Culture consortium gave a lovely and whimsical talk entitled A Data Alchemist’s Journey through NFDI which explored ways that we might federate and jointly query both consortia’s knowledge via their respective SPARQL endpoints. He proposed a toy example in which he linked paintings depicting alchemists trying to make gold to…

Representing Negative Knowledge

Representing negative knowledge in the semantic web is an open problem. This post is going to be a living document where I keep notes on use cases, potential solutions, and awful hacks.

Suggesting new relations in ROR from Wikidata

I was looking at the different NFDI consortia in the Research Organization Registry (ROR), and found that the only two that have a parent relations to the NFDI (ror:05qj6w324) are NFDI4DS (ror:00bb4nn95) and MaRDI (ror:04ncnzm65). This felt strange to me, so I started looking around Wikidata to see if I could automatically make a curation sheet to send along to them. I found that Wikidata already…

Switching from using Tox to Just

I became aware of just while watching Hynek’s second video on uv a few months ago. I immediately fell in love with its elegance and simplicity, so I have begun replacing task running in my repositories that relied on tox with just. This post gives a bit of background, context, and walks through making the switch on one of my repositories that has some annoying dependencies.

Exploring an unfamiliar SPARQL endpoint with the Bioregistry - a case study from NFDI4Culture

Earlier this week at the sixth NFDI4Chem consortium meeting, Torsten Schrade from the NFDI4Culture consortium gave a lovely and whimsical talk entitled A Data Alchemist’s Journey through NFDI which explored ways that we might federate and jointly query both consortia’s knowledge via their respective SPARQL endpoints. This post is about the very first steps I took when looking into this new (to me)…

Validating the FAIRness of knowledge graphs and ontologies in RDF using the Bioregistry

Using standard CURIE prefixes and URI prefixes in semantic web artifacts such as Resource Description Framework (RDF) promotes interoperability, enables reuse in downstream data integration, and makes data more FAIR. The Bioregistry defines a set of standard CURIE prefixes and URI prefixes against which RDF files can be validated/standardized. This blog post describes a new CLI tool bioregistry…

A historical analysis of ChEMBL

I’ve recently submitted an article to the Journal of Open Source Software (JOSS) describing chembl-downloader, a Python package for automating downloading and using ChEMBL data in a reproducible way. In this post, I use chembl-downloader to show how the number of compounds, assays, activities, and other entities in ChEMBL have changed over time.

Measuring the impact of the Bioregistry

The Bioregistry is a database and toolchain for standardization of prefixes, CURIEs, and URIs that appear in linked (open) data. While I created it in 2019 as a component of PyOBO in order to support parsing database cross-references appearing in biomedical ontologies, it has since become an independent project with a community-driven governance model and much broader applications. This post is a…

The Bioregistry and BiomarkerKB

The Bioregistry is a community-driven registry of semantic spaces and their metadata. When I learned about BiomarkerKB at the International Society for Biocuration’s 18th Annual International Biocuration Conference, I was excited to curate new records (and prefixes) in the Bioregistry to cover BiomarkerKB’s semantic spaces on biomarkers. This post summarizes the discussions I’ve had with its…

Text-based embeddings of ontology terms

The Ontology Lookup Service (OLS) is now indexing dense embeddings for ontology terms constructed from term labels, synonyms, and descriptions using LLMs. I maintain a Python client library for the OLS (ols-client) and was recently asked to implement a wrapper to the OLS’s API endpoint that exposes these embeddings. This post is a demo of how to use that code, and how I replicated the same…

Inference over Semantic Mappings with SeMRA

Assembling and inferring missing semantic mappings is a timely problem in biomedical data and knowledge integration. I’ve been developing the Semantic Mapping Assembler and Reasoner (SeMRA) as a generic toolkit for this. In this blog post, I highlight its inference capabilities.

I wish I could unpack Callables in Python type annotations

Following the theme of my previous two posts, I’ve run into another typing conundrum where I want to unpack a pre-existing Callable into a class with Generic[P, T] where P is a parameter specification type (i.e. ParamsSpec)

Using ParamSpec with Python Generics

I’ve been working on applying strict static typing to my Python package class-resolver and ran into an interesting way of using generics in combination with parameter specification variables (i.e., ParamSpecs).

A dilemma with PEP-696 default generics when using optional static typing in Python

This post describes an issue I’ve had with writing correct types when using PEP-696 defaults in typing.TypeVar. I posted the exploration in a companion repository on GitHub.

The EFO_ID column in ChEMBL’s drug indications table isn’t what you think it is

ChEMBL periodically curates clinical trial information into its DRUG_INDICATION table. However, there’s some weird inconsistencies in the way it references disease concepts in external vocabularies. This blog post is an exploration of that table.

Data Modeling and Integration with Clinical Trials

I’ve recently worked with clinical studies from ClinicalTrials.gov and other international registries. This post is a review on how to access data, a proposal for how it can be modeled using the Ontology for Biomedical Investigations (OBI), a proof-of-concept ontologization of ClinicalTrials.gov, and some insights into how this data can be integrated with other resources to address classical…

Books I Read in 2024

Here’s the books I read in 2024. If I were Dudley Dursley, I’d be very upset that I read one fewer new book than in 2023. But then, I’d remember that I re-read a lot of Cosmere in 2024 to prepare for Wind and Truth, which was great.

Exploring Event Venues in Wikidata

I was working on making data about scholarly conferences more FAIR and a big question crossed my mind: what are all the conference venues? This post is about some queries I wrote for Wikidata, data issues I found, and a few drive-by curations that I did while looking for an answer, and my ideas for the future.

Notes on Open Source Funding

This stub post contains my notes about funding for open source software. It doesn’t follow a story like a lot of my posts, and is more like an ever-evolving notes sheet.

Downloading Audio from Soundcloud

Brandon Sanderson has been releasing a few chapters a week of his upcoming novel, Wind and Truth, on his publisher’s website leading up to its December 6th release. This includes the audiobook chapters, but they’re posted to Soundcloud and there’s no good way to listen at 1.6x speed. This post is a note sheet on how to download audio from Soundcloud and prepare it for my audiobook reader.

Dependency Groups and ReadTheDocs

PEP 735 introduced dependency groups in packaging metadata, which are complementary to optional dependencies in that they might not correspond to features in the package, but rather be something like development or release dependencies. I am slowly working towards updating my cookiecutter template cookiecutter-snekpack to use PEP 735. So far, uv and tox have released support - all that’s left is…

Building Graphviz when installing PyGraphviz

Graphviz is software for graph visualization written in C. PyGraphviz provides a nice Python wrapper for it. The issue is that getting Python to know about the C headers changes every few months. I’ll try and keep this blog post updated every time there are some changes.

Some Haskell I Tried to Write

I’m working through making a contribution to pandoc that adds first-class support for author role annotations using the Contribution Role Taxonomy (CRediT) and also outputs compliant Journal Publishing Tag Set (JATS) XML. This has lead me down a (losing) journey with learning the Haskell programming language, so I thought I would post a short note on a function I tried to understand.

Programmatic Access to a Wordpress User List

The International Society of Biocuration (ISB) partners with the journal Database to get discounts for its members when they publish there. This means the ISB’s executive committee needs to send a member list to the journal’s editor. Historically, this has been done manually by exporting the list from the membership management plugin in the ISB Wordpress blog once per month and emailing it to th…

Easier ORCID

The Open Researcher and Contributor Identifier (ORCID) database is an invaluable resource that supports the unambiguous identification of researchers. However, its first party data dump is too complex, verbose, and unstandardized for many use cases. This post describes open source software I wrote that automates downloading, processing, and exporting ORCID into a more usable form. I put the…

Discussions and Follow-ups from Biocuration 2024

I’ve just returned from the 17th Annual International Biocuration Conference at the Indian Biological Data Centre (IBDC) in Faridabad, India. I wanted to highlight some of the interesting conversations I had while I was there, and ideas for follow-up. Most were centered around the Bioregistry and the Semantic Mapping Assembler and Reasoner (SeMRA), which I gave an oral presentation on.

Semantic Pydantic

Using Pydantic for encoding data models and FastAPI for implementing APIs on top of them has become a staple for many Python programmers. When this intersects with the semantic web, linked open data, and the natural sciences, we are still lacking a bridge to annotate our data models and APIs to make them more FAIR (findable, accessible, interoperable, and reusable). In this post, we build an…

Books I Read in 2023

I finally got back into reading! Over winter break 2022, I started the Stormlight Archive then followed up in 2023 by reading the entirety of Brandon Sanderson’s Cosmere, as well as a some other fantasy, science fiction, and literary fiction. Here’s the list.

Unlocking UMLS

The Unified Medical Language System (UMLS) is a widely used biomedical and clinical vocabulary maintained by the United States National Library of Medicine. However, it is notoriously difficult to access and work with due to licensing restrictions and its complex download system. In the same vein as my previous posts about DrugBank and ChEMBL, this post describes open source software I’ve…

Reproducibility Pilot in the Journal of Cheminformatics

I’ve been working on improving reproducibility in the field of cheminformatics for some time now. For example, I’ve written posts about making data from DrugBank and ChEMBL more actionable. Over the last year, I’ve been preparing a concept with the editors of the Journal of Cheminformatics on how to include an assessment of reproducibility to reviews of manuscripts submitted to the journal. This…