This is the heart of the FörderFunke Web App. It takes the requirement profiles (machine readable eligibility rules for benefits, SHACL format) from the Knowledge Base and compares them to the user profile (RDF format). The comparison is done by running a SHACL validation for each requirement profile against the user profile. Beforehand, the user profile gets enriched via SPARQL queries that add knowledge that can be inferred without having to ask the user; like their age based on the birthday or the federal state based on their city.
Afterwards, each requirement profile falls into one of three categories: eligible, ineligible or missing data to make that assessment. The missing data fields are aggregated and the "most missed one" will be presented to the user as question next. In that way we ensure the most effective path from an empty profile to having all the answers for any particular user. The questionnaire ends, when no more requirement profile flags missing data points.
📺 The first part of video 2 and the middle part of video 3 in this demo series are showing parts of the matching engine logic.
- Input: user profile, requirement profiles, datafield definitions, materialization rules
- Output: a report about eligibilities (yes, no, missing data), prioritized missing data fields and constraint violations
npm install
npm test
# example for running a specific test:
npm test -- --grep "full matching"
# after bumping the version
npm publishnpm install --save @foerderfunke/matching-engine
import { ValidationResult } from "@foerderfunke/matching-engine"- Every requirement profile must start with the triple:
<rpUri> a ff:RequirementProfile - Mandatory:
<rpUri> ff:hasMainShapepoints to one main shape - Optional:
<rpUri> ff:hasFlowShapepoints to decision tree logic - Multiple
sh:NodeShapes are allowed (e.g. forff:Citizenandff:Child), but not for the samesh:targetClass. The only exception is for the shapes thatff:hasMainShapeandff:hasFlowShapepoint to - If a
sh:nodeorsh:qualifiedValueShapeare pointing to anothersh:NodeShape, that shape must have ash:targetClass - Every
sh:PropertyShapemust havesh:minCount 1(higher values are allowed), otherwise we can't recognize if that datapoint is missing