The ontology contained in this repository was initially created by the Kuratorium für Technik und Bauwesen in der Landwirtschaft e.V. during the SIMLEARN project. Its purpose was twofold:
- it was used to translate data that contained numeric soil grain size fractions determined in the lab into their soil texture classification counterpart (and vice versa from classes to clay/silt/sand fraction ranges).
- it served as a testbed ontology for more complex reasoning, especially type inference from numeric ranges of properties
As the ontology was more a side result of the project, it remained unpublished for a certain time. As there was some demand for a formal representation of a soil texture taxonomy and classification within the FAIRagro project, the creators however decided to disseminate this work now through this repository.
The ontology has initially been created based upon the German soil texture classification system as described in the Bodenkundliche Kartieranleitung, edition 4 (KA4 - in particular table 26 on page 135 of that document). It has been cross-checked against the most recent 6th edition of the Kartieranleitung with no need for changes being observed.
Thus, at the moment it covers requirements for being used as descriptors for datasets only that have been recorded according to that system. The ontology however is easily extensible and using the existing class definitions and hierarchy as a template, basically any different soil texture classification system can be added, like the USDA system, which has different grain diameter limits. Feel free to send patches/pull requests for that - also if you spot errors.
Given a dataset represented as a knowledge graph in RDF, you can use a reasoner to assign soil texture classes as rdf:types to for example sample objects, given the following preconditions:
- Instances to be classified have to use the properties :sandFraction, :siltFraction and :clayFraction defined in the ontology for specifying determined values.
- Their value space has to be a double with a range between 0 and 1. In other words: we do not use percentages but fractions!
The ontology does not allow for the reasoner to check whether the sum of these values is 1.0 - if anybody has an idea on how to achieve this efficiently with a certain tolerance, drop us a note.
So, for example, if a dataset contains the following turtle snippet:
:SampleX :sandFraction 0.13 ;
:siltFraction 0.45 ;
:clayFraction 0.42 .
a reasoner will infer the following statement from the ontology:
:SampleX rdf:type :KA4Lt3 .
You can then query for example for the textual description of this class, which would be "mittel toniger Lehm", get at the skos:definition containing a description of its class boundaries or walk up the class/concept hierarchy to find out that KA4Lt3 is a rdfs:subClass of :KA4ut - reflecting the "Bodenartengruppe".
Up to now, we tested only with the HermiT reasoner using Protégé and another small program in Java using the owlapi. You will get results very quickly, if you hand the ontology and just a single data instance to the reasoner. But already giving it two data instances led to unpredictable runtime behaviour. It will output results, but it can take almost arbitrary amounts of time. The phenomenon is known to the hermite developers and attributed to the Java collection library implementation (see B. Motik, R. Shearer, I. Horrocks (2009): Hypertableau Reasoning for Description Logics, Journal of Artificial Intelligence Research 36, p. 219).
Development of the ontology in the SIMLEARN project was supported by the German Ministry for Education and Research (BMBF) under the grant number 01|S19073. The FAIRagro project is funded by the German Research Foundation (DFG) - project number 501899475.