Food Model Mapping

In the following chapters we describe the basic principles used for mapping from arbitrary food models to others. And in particular matching Food Consumption Data with Food Composition Data.

Generic Types

Semantic Identifier

A Semantic Identifier (SID) references data objects across system boundaries.

Semantic Identifier (SID)
Figure 1. Semantic Identifier (SID)

Example use, referencing a food, product or facet.

Java
// within BLS v3.02 represents 'Banana raw'
var blsBanana = SemanticIdentifier.parse("de.bls/3.02", "food/F503100");
var totalSuguar = SemanticIdentifier.parse("de.bls/3.02", "comp/KMD");

// within LanguaL 2017 Facet Category - A (PRODUCT TYPE) represents 'Bananas' from GS1 ontology
var gs1BananaId = new SemanticIdentifier("langual/2017:A1415");

Qualified Map

A Qualified Map Entry relates data objects from one system to another, optionally respecting qualifiers, that allow for fine-grained conditionals like facet term codes (FTCs).

Qualified Map Entry
Figure 2. Qualified Map Entry

Example use, adding a map-entry, then looking it up.

Java
// food consumption descriptors
SemanticIdentifier consumedBananaId = ...
SemanticIdentifierSet facets = ...

// food composition database entry reference
SemanticIdentifier fcdbBananaId = ...

var qMap = new QualifiedMap();

// puts a new entry into the map
qMap.put(new QualifiedMapEntry(consumedBananaId, facets, fcdbBananaId));

// lookup entries
Optional<QualifiedMapEntry> result = qMap.lookupEntry(consumedBananaId, facets);

Food Composition Database (FCDB)

Food Component Catalog and Components

A Food Component Catalog collects all available food components, that are within the scope of a food composition database (FCDB).

A Food Component represents a chemical substance (e.g. Carbohydrates) or other food component or other food specific value, that in some cases is independent of the consumed amount e.g. 'recommended daily dosage' or 'protein animal to plant ratio'.

Food Component Catalog and Components
Figure 3. Food Component Catalog and Components
1 Component units RATIO and PERCENT indicate that the component is invariant with respect to the amount consumed.

Example use, adding a food component to its catalog, then looking it up.

Java
var componentCatalog = new FoodComponentCatalog();

// food component identifier
SemanticIdentifier componentId = ...

// puts a new food component into the catalog
componentCatalog.put(new FoodComponent(componentId, ComponentUnit.GRAM, MetricPrefix.MILLI));

// lookup a food component by its semantic identifier
Optional<FoodComponent> result = componentCatalog.lookupEntry(componentId);

Food Composition and Datapoints

A Food Composition represents a collection of data-points for a specific food.

A Food Component Datapoint represents a measured or calculated value for the relative mass amount of a chemical substance or other food component or simply a food specific fixed value like 'recommended daily dosage' or 'protein animal to plant ratio'.

Food Composition and Datapoints
Figure 4. Food Composition and Datapoints
1 ConcentrationUnit: how to quantify the amount of dietary components consumed for this associated food (or product)
2 DatapointSemantic: how the datapoint is interpreted (as-is or as upper-bound)

Food Composition Repository

A Food Composition Repository incorporates

  • a food component catalog and

  • many food compositions with their datapoints.

Food Composition Repository
Figure 5. Food Composition Repository

Example use, loading data model from zipped yaml file, then lookup an entry.

Java
import org.apache.causeway.commons.io.DataSource;
import io.github.causewaystuff.commons.compression.SevenZUtils;

// decompress data source from zipped yaml file
DataSource foodCompositionDataSource = SevenZUtils
    .decompress(DataSource.ofFile("fcdb.7z"));

// read in data
var foodCompositionRepo = FoodCompositionRepository.tryFromYaml(foodCompositionDataSource)
    .valueAsNonNullElseFail();

// food identifier
SemanticIdentifier foodId = ...

// lookup a food composition entry by its semantic food identifier
Optional<FoodComposition> result = foodCompositionRepo.lookupEntry(foodId);

Food Consumption and Composition Resolution

Food Consumption

A Food Composition represents an amount of some food or product that was consumed.

Food Consumption
Figure 6. Food Consumption

Food Consumption with Composition

A Food Consumption with Composition relates consumption with composition information. Instances are usually the result of food composition resolution. (see below)

Food Consumption with Composition
Figure 7. Food Consumption with Composition

Food Composition Resolution (via Nutrient Mapping)

Food consumption data (typically originating from recall 24 interviews) is mapped to a food composition database, that provides (measured or estimated) chemical food component quantities for a given specific food.

In effect, consumed quantities of food X can be resolved to consumed quantities of nutrients A, B, C, etc..

Food Composition Resolution
Figure 8. Food Composition Resolution
1 respondentAlias: first part of the secondary object identifier
2 date: second part of the secondary object identifier