Computing the difference between any two schemas is a recognised need among data modellers, and a well-known problem to solve in the knowledge graph space, especially so when looking beyond trivial plain-text line diffs. That is: modellers, taxonomists, and ontologists want to know the semantic difference in their modelling project revisions, not whether the output simply rearranged text. Was a class added or was it moved elsewhere in the graph? Did the attribute’s data type change? Were annotations added, updated, or deleted? In which languages?
The problems
For ontologies and RDF graphs in particular, generating diffs is not a new question, and several tools exist to address this. For instance, Ecco (once upon a time part of the Manchester tools) and OWL Diff focus on OWL 2 DL coverage and OWL only, while Quit Diff (part of the Quit Store RDF VCS) and rdfdiff (from Jena tools) zoom in on instance data. For basic use, there is the popular OWL Difference plug-in for Protégé. However, for many lightweight ontologies and RDF-seralised “vocabularies”, these tools are either overkill or inadequate, or not configurable enough to specify what to compare on or to produce a change report. Therefore, there is a need for something in the middle.
A solution: RDF Differ
Enter RDF Differ, which fills exactly this gap in semantic diffing: a schema-aware RDF diff tool that supports dynamic, profile-driven vocabulary comparisons through a self-hosted web application. It uses configurable application profile (AP) templates and SPARQL-based change detection to support dynamic and context-sensitive comparisons, topped off with automated HTML and JSON report generation.
Figure 1. The RDF Differ pipeline, consisting of the web application and supporting tools.
RDF Differ builds on the SPARQL-based delta techniques of skos-history and is supported by additional tooling. The helper tool diff-query-generator (dqgen in short) is responsible for the customizable profiles, while the companion library eds4jinja2–which warrants its own share of attention for those of you familiar with Jinja–helps with the customizable reports. Together with the main web service rdf-differ-ws, they form a pipeline of tools and libraries working in harmony.
The diffing profiles (corresponding to your desired APs) can be considered as “lenses” over vocabularies (and data) represented in, for example, SKOS core, SKOS-XL, OWL1, OWL2, SHACL, etc. One needs to know how many concepts, classes, or data shapes have changed. The supported change types are addition, deletion, update, move, and change. The last three change types can be collectively interpreted as “modification”, where an update is the change of a value of a literal or object, while a move is the shifting of a value from one resource (class or property) to another, and a change refers to the shifting of a value from one property to another within the same resource.
Here’s a screenshot of a (small) section of a report:
Technical details of the RDF Differ implementation, along with the specification of the change type inventory, are described in the recently accepted demo paper, RDF Differ: Configurable Change Reporting for RDF Vocabularies. It will be presented at the 21st conference on Semantic Systems (SEMANTiCS’25) by Meaningfier Jana Ahmad, which will take place in Vienna from 3 to 5 September 2025.
RDF Differ evaluation with ePO compared to OWL Difference
We didn’t just build the tool and dump it on GitHub, but also evaluated it to:
- show that it works for a business case-based evaluation;
- compare it against the identified case’s current practices;
- compare RDF Differ against the relatively closest other diff tool while demonstrating differences.
The business case selected was the eProcurement Ontology (ePO), which is being developed by the Publications Office of the European Union (OP) as part of the Digital Europe Programme (DEP), and is already used in several projects and initiatives, such as the Public Procurement Data Space (PPDS).
To show RDF Differ’s functionality, we compared the last two stable minor versions of ePO-core, being v4.1.0 and v4.2.0, of which we assumed that there would be a manually assessable number of changes, and it has a publicly available manual changelog. Based on the tool comparisons (see Table 1 in the paper), we selected OWL Difference.
To make a long story short, here’s a visualisation of the comparison of the respective tool outputs:
We compared the output of RDF Differ to the official ePO changelog, and observed several differences in the diffs. Among others, the ePO changelog underreported changes, such as listing the addition of 9 object properties, whereas RDF Differ detected 22 additions. ePO’s changelog also reported that epo:isSMESuitable was newly added, even though it was already included in previous versions. The ePO changelog also includes changes in cardinality constraints and domain/range axioms that the reports by OWL Difference and RDF Differ do not include.
Next steps: try it yourself, visit our demo at SEMANTiCs’25, or contact us
You can try out the tool either by installing it yourself from the RDF Differ GitHub repo, accessing it directly from the test instance, speaking to us directly at SEMANTiCS’25 (if you’re reading this before the conference), or simply contacting us for an online demo. If there’s enough interest, we might extend its functionality further, such as a more user-friendly interface for the component to specify the diffing profile (the dqgen module), support for OWL 2 EL, or performance optimisations for the impatient.

0 Comments