diff --git a/NTO/Accounting/attributes/commercialPartnerCountryCode.ttl b/NTO/Accounting/attributes/commercialPartnerCountryCode.ttl
deleted file mode 100644
index e87628447fa..00000000000
--- a/NTO/Accounting/attributes/commercialPartnerCountryCode.ttl
+++ /dev/null
@@ -1,14 +0,0 @@
-@prefix ogit.Accounting: .
-@prefix ogit: .
-@prefix owl: .
-@prefix rdfs: .
-@prefix dcterms: .
-
-ogit.Accounting:commercialPartnerCountryCode
- a owl:DatatypeProperty;
- rdfs:subPropertyOf ogit:Attribute;
- rdfs:label "commercialPartnerCountryCode";
- dcterms:description "ISO 3166-1 alpha-2 code of the commercial partner's country. Denormalised root-level promotion of the Odoo 3-hop chain `partner_id.commercial_partner_id.country_id.code` (or `move_id.commercial_partner_id.country_id`). Load-bearing for sanctions cross-reference (OFAC/EU/UN list jurisdiction match), VAT reverse-charge determination, and Peppol/UBL e-invoice routing. Maintained via ComputeRecompute cascade on the parent partner-chain.";
- dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
-.
diff --git a/NTO/Accounting/attributes/counterpartyCountryCode.ttl b/NTO/Accounting/attributes/counterpartyCountryCode.ttl
new file mode 100644
index 00000000000..8f486e6ebfd
--- /dev/null
+++ b/NTO/Accounting/attributes/counterpartyCountryCode.ttl
@@ -0,0 +1,14 @@
+@prefix ogit.Accounting: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Accounting:counterpartyCountryCode
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "counterpartyCountryCode";
+ dcterms:description "ISO 3166-1 alpha-2 code of the country of the counterparty (the customer or supplier) of a journal entry. Used to match sanctions-list jurisdictions, to decide VAT reverse charge and to route e-invoices (Peppol/UBL). Kept on the entry so these checks do not have to follow the counterparty relation.";
+ dcterms:valid "start=2026-05-28;";
+ dcterms:creator "Claude (AdaWorldAPI)";
+.
diff --git a/NTO/Accounting/attributes/fiscalCountryCode.ttl b/NTO/Accounting/attributes/fiscalCountryCode.ttl
index fdf656e23e5..14f495fbcca 100644
--- a/NTO/Accounting/attributes/fiscalCountryCode.ttl
+++ b/NTO/Accounting/attributes/fiscalCountryCode.ttl
@@ -8,7 +8,7 @@ ogit.Accounting:fiscalCountryCode
a owl:DatatypeProperty;
rdfs:subPropertyOf ogit:Attribute;
rdfs:label "fiscalCountryCode";
- dcterms:description "ISO 3166-1 alpha-2 code of the fiscal country of this entity's company. Denormalised root-level promotion of the Odoo 3-hop chain `company_id.account_fiscal_country_id.code` (5 occurrences across TIER-1 addons per lance-graph EXT-1..6). Collapses VAT calc / sanctions cross-reference / jurisdiction routing reads from O(3) Many2one traversal to O(1) codebook lookup. Recomputed via ComputeRecompute cascade when the entity's company or that company's fiscal country changes.";
+ dcterms:description "ISO 3166-1 alpha-2 code of the fiscal country of the company that owns this entity. Used for VAT calculation, sanctions checks and jurisdiction routing. Kept on the entity so these checks do not have to follow the company relation; the hasFiscalCountry edge gives the same jurisdiction as a FiscalJurisdiction node.";
dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
+ dcterms:creator "Claude (AdaWorldAPI)";
.
diff --git a/NTO/Accounting/attributes/isEuMember.ttl b/NTO/Accounting/attributes/isEuMember.ttl
index 4cd80b47872..04565ac8f49 100644
--- a/NTO/Accounting/attributes/isEuMember.ttl
+++ b/NTO/Accounting/attributes/isEuMember.ttl
@@ -8,7 +8,7 @@ ogit.Accounting:isEuMember
a owl:DatatypeProperty;
rdfs:subPropertyOf ogit:Attribute;
rdfs:label "isEuMember";
- dcterms:description "Boolean — true iff this fiscal jurisdiction is a current EU member state. Codebook attribute on FiscalJurisdiction. Hot path for VAT reverse-charge eligibility (intra-EU B2B reverse-charge rules), Peppol/UBL e-invoice routing, and MOSS / OSS classification.";
+ dcterms:description "True if this fiscal jurisdiction is a current EU member state. Used to decide intra-EU reverse charge, Peppol/UBL routing and OSS classification.";
dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
+ dcterms:creator "Claude (AdaWorldAPI)";
.
diff --git a/NTO/Accounting/attributes/iso3166Alpha2.ttl b/NTO/Accounting/attributes/iso3166Alpha2.ttl
index 4e94988b2c3..63bb220a6d1 100644
--- a/NTO/Accounting/attributes/iso3166Alpha2.ttl
+++ b/NTO/Accounting/attributes/iso3166Alpha2.ttl
@@ -8,7 +8,7 @@ ogit.Accounting:iso3166Alpha2
a owl:DatatypeProperty;
rdfs:subPropertyOf ogit:Attribute;
rdfs:label "iso3166Alpha2";
- dcterms:description "Two-letter ISO 3166-1 alpha-2 country code (e.g. `DE`, `AT`, `CH`, `US`). Canonical codebook key for the FiscalJurisdiction entity — used as the indexed attribute that makes country lookups O(1). The two-letter form is the universal join key across Odoo (`res.country.code`), Peppol/UBL (`ram:CountryCode`), SWIFT BIC country segment, and OFAC sanctions list jurisdiction filters.";
+ dcterms:description "Two-letter ISO 3166-1 alpha-2 country code (for example `DE`, `AT`, `CH`, `US`). The indexed key of FiscalJurisdiction: one jurisdiction per code. The same two-letter code is used by Peppol/UBL, by the country segment of a SWIFT BIC and by sanctions-list jurisdiction filters.";
dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
+ dcterms:creator "Claude (AdaWorldAPI)";
.
diff --git a/NTO/Accounting/attributes/productCategoryComplete.ttl b/NTO/Accounting/attributes/productCategoryComplete.ttl
deleted file mode 100644
index 60dc51dc72a..00000000000
--- a/NTO/Accounting/attributes/productCategoryComplete.ttl
+++ /dev/null
@@ -1,14 +0,0 @@
-@prefix ogit.Accounting: .
-@prefix ogit: .
-@prefix owl: .
-@prefix rdfs: .
-@prefix dcterms: .
-
-ogit.Accounting:productCategoryComplete
- a owl:DatatypeProperty;
- rdfs:subPropertyOf ogit:Attribute;
- rdfs:label "productCategoryComplete";
- dcterms:description "Slash-separated full category path of a product (e.g. `All / Saleable / Goods`). Denormalised root-level promotion of the Odoo 3-hop chain `product_id.product_tmpl_id.categ_id.complete_name` (and the 2-hop variant `product_id.categ_id.complete_name`). Hot path for tax-category routing, MwSt-Satz selection (SKR03/SKR04 mapping), and inventory cost-method dispatch. Recomputed on product template or category change.";
- dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
-.
diff --git a/NTO/Accounting/attributes/vatRateStandard.ttl b/NTO/Accounting/attributes/vatRateStandard.ttl
index 3f7015bd325..68755263a34 100644
--- a/NTO/Accounting/attributes/vatRateStandard.ttl
+++ b/NTO/Accounting/attributes/vatRateStandard.ttl
@@ -8,7 +8,7 @@ ogit.Accounting:vatRateStandard
a owl:DatatypeProperty;
rdfs:subPropertyOf ogit:Attribute;
rdfs:label "vatRateStandard";
- dcterms:description "Standard VAT / Mehrwertsteuer rate of this fiscal jurisdiction, expressed as a decimal fraction (e.g. `0.19` for the German 19% Regelsteuersatz). Codebook attribute on FiscalJurisdiction. Reduced rates and special exemptions are not modelled here — use the per-jurisdiction Tax entity for those.";
+ dcterms:description "Standard VAT rate of this fiscal jurisdiction as a decimal fraction (for example `0.19` for 19%). Reduced rates and exemptions are not modelled here; use the jurisdiction's Tax entity for those.";
dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
+ dcterms:creator "Claude (AdaWorldAPI)";
.
diff --git a/NTO/Accounting/entities/FiscalJurisdiction.ttl b/NTO/Accounting/entities/FiscalJurisdiction.ttl
index 87a8c1448ad..b68caea42c9 100644
--- a/NTO/Accounting/entities/FiscalJurisdiction.ttl
+++ b/NTO/Accounting/entities/FiscalJurisdiction.ttl
@@ -1,5 +1,7 @@
@prefix ogit.Accounting: .
@prefix ogit: .
+@prefix ogit.Compliance: .
+@prefix ogit.FinancialMarket: .
@prefix rdfs: .
@prefix dcterms: .
@@ -7,9 +9,9 @@ ogit.Accounting:FiscalJurisdiction
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "FiscalJurisdiction";
- dcterms:description "Codebook entry pinning a fiscal jurisdiction by ISO 3166-1 alpha-2 code. The canonical lookup target for `hasFiscalCountry` edges and the resolved leaf of the Odoo 3-hop chain `entity.company_id.account_fiscal_country_id`. Strict codebook semantics: one entry per ISO 3166-1 alpha-2 code, no duplicates. Standard VAT rate + EU membership are denormalised onto the entry so jurisdiction-conditional logic (reverse-charge, MOSS/OSS, GoBD applicability) reads as O(1) attribute access, not a downstream graph join. Cross-jurisdictional sanctions cross-reference is supported via an outbound edge to ogit.Compliance:SanctionsEntry when the jurisdiction maintains a sanctions programme.";
+ dcterms:description "A fiscal jurisdiction, identified by its ISO 3166-1 alpha-2 code: one entry per code. The target of hasFiscalCountry edges. Carries the standard VAT rate and EU membership, so jurisdiction-dependent rules (reverse charge, OSS, record-keeping obligations) read an attribute instead of following further edges. Links to a sanctions entry when the jurisdiction runs a sanctions programme.";
dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
+ dcterms:creator "Claude (AdaWorldAPI)";
ogit:scope "NTO";
ogit:parent ogit:Node;
ogit:mandatory-attributes (
diff --git a/NTO/Accounting/entities/JournalEntry.ttl b/NTO/Accounting/entities/JournalEntry.ttl
index 80d0600e571..17c697d6c12 100644
--- a/NTO/Accounting/entities/JournalEntry.ttl
+++ b/NTO/Accounting/entities/JournalEntry.ttl
@@ -8,9 +8,9 @@ ogit.Accounting:JournalEntry
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "JournalEntry";
- dcterms:description "A double-entry accounting journal entry — the canonical OGIT projection of Odoo `account.move` (and the deeply analogous SAP `BSEG` document line, MS Dynamics `JournalLine`, DATEV `Buchung`). Demonstrates the 3-hop optimisation doctrine: instead of the lookups `entity.company_id.account_fiscal_country_id.code` (5+ Odoo sites) and `move.commercial_partner_id.country_id`, the leaf attributes are promoted onto JournalEntry directly (`fiscalCountryCode`, `commercialPartnerCountryCode`) and the intermediate hops are also accessible via the shortcut verb `hasFiscalCountry` for graph traversal. Both routes are kept — promoted attribute for hot-path reads, edge verb for cascade traversal — and the EdgeColumn ComputeRecompute cascade keeps them coherent.";
+ dcterms:description "A double-entry accounting journal entry: a dated, balanced set of debit and credit lines in one currency, with a status (for example draft or posted). The fiscal country of the owning company and the country of the counterparty are kept on the entry (fiscalCountryCode, counterpartyCountryCode) for VAT and sanctions checks; the hasFiscalCountry edge links the same jurisdiction as a node.";
dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
+ dcterms:creator "Claude (AdaWorldAPI)";
ogit:scope "NTO";
ogit:parent ogit:Node;
ogit:mandatory-attributes (
@@ -25,13 +25,13 @@ ogit.Accounting:JournalEntry
ogit:createdAt
ogit:lastUpdatedAt
ogit.Accounting:fiscalCountryCode
- ogit.Accounting:commercialPartnerCountryCode
+ ogit.Accounting:counterpartyCountryCode
);
ogit:indexed-attributes (
ogit:id
ogit:status
ogit.Accounting:fiscalCountryCode
- ogit.Accounting:commercialPartnerCountryCode
+ ogit.Accounting:counterpartyCountryCode
);
ogit:allowed (
[ ogit.Accounting:hasFiscalCountry ogit.Accounting:FiscalJurisdiction ]
diff --git a/NTO/Accounting/verbs/hasFiscalCountry.ttl b/NTO/Accounting/verbs/hasFiscalCountry.ttl
index b03a305bbb3..82a28625c96 100644
--- a/NTO/Accounting/verbs/hasFiscalCountry.ttl
+++ b/NTO/Accounting/verbs/hasFiscalCountry.ttl
@@ -8,7 +8,7 @@ ogit.Accounting:hasFiscalCountry
a owl:ObjectProperty;
rdfs:subPropertyOf ogit:Verb;
rdfs:label "hasFiscalCountry";
- dcterms:description "Direct edge from a fiscal entity (JournalEntry, CompanyEntity, FinancialInstrument, Tax) to its fiscal jurisdiction (FiscalJurisdiction codebook entry / FinancialMarket:Country). Collapses the Odoo 2-hop chain `entity.company_id.account_fiscal_country_id` and the 3-hop variant `entity.company_id.account_fiscal_country_id.code` into one typed edge in the EdgeColumn. Targets: ogit.Accounting:FiscalJurisdiction (preferred) or ogit.FinancialMarket:Country.";
+ dcterms:description "Links a fiscal entity (journal entry, company, financial instrument, tax) to the jurisdiction whose tax rules apply to it. Target: ogit.Accounting:FiscalJurisdiction, or ogit.FinancialMarket:Country.";
dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
+ dcterms:creator "Claude (AdaWorldAPI)";
.
diff --git a/NTO/Accounting/verbs/hasPickingType.ttl b/NTO/Accounting/verbs/hasPickingType.ttl
deleted file mode 100644
index 5968c905e9c..00000000000
--- a/NTO/Accounting/verbs/hasPickingType.ttl
+++ /dev/null
@@ -1,14 +0,0 @@
-@prefix ogit.Accounting: .
-@prefix ogit: .
-@prefix owl: .
-@prefix rdfs: .
-@prefix dcterms: .
-
-ogit.Accounting:hasPickingType
- a owl:ObjectProperty;
- rdfs:subPropertyOf ogit:Verb;
- rdfs:label "hasPickingType";
- dcterms:description "Direct edge from a stock move / move line to its picking-type configuration. Collapses the Odoo 3-hop chain `picking_id.picking_type_id.` into one typed edge that the EdgeColumn cascade can follow without intermediate hops. Used by warehouse routing + inventory-event dispatch.";
- dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
-.
diff --git a/NTO/Accounting/verbs/hasProductCategory.ttl b/NTO/Accounting/verbs/hasProductCategory.ttl
deleted file mode 100644
index c3cbb1e7455..00000000000
--- a/NTO/Accounting/verbs/hasProductCategory.ttl
+++ /dev/null
@@ -1,14 +0,0 @@
-@prefix ogit.Accounting: .
-@prefix ogit: .
-@prefix owl: .
-@prefix rdfs: .
-@prefix dcterms: .
-
-ogit.Accounting:hasProductCategory
- a owl:ObjectProperty;
- rdfs:subPropertyOf ogit:Verb;
- rdfs:label "hasProductCategory";
- dcterms:description "Direct edge from a line item / stock move / sale order line to its product category. Collapses the Odoo 3-hop chain `line.product_id.product_tmpl_id.categ_id` (and the 2-hop variant on simpler models) into one typed edge. Hot path for tax-mapping (SKR03 vs SKR04 routing), inventory valuation method dispatch, and reporting aggregation.";
- dcterms:valid "start=2026-05-28;";
- dcterms:creator "Claude (AdaWorldAPI/lance-graph 3-hop optim)";
-.
diff --git a/NTO/Healthcare/attributes/anomize.ttl b/NTO/Healthcare/attributes/anomize.ttl
new file mode 100644
index 00000000000..00adc7f4a56
--- /dev/null
+++ b/NTO/Healthcare/attributes/anomize.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:anomize
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "anomize";
+ dcterms:description "Anonymisation flag for research export (praxis_patient.p_anomize).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_anomize";
+ ogit:type "xsd:boolean";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/birth.ttl b/NTO/Healthcare/attributes/birth.ttl
new file mode 100644
index 00000000000..0debfab9129
--- /dev/null
+++ b/NTO/Healthcare/attributes/birth.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:birth
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "birth";
+ dcterms:description "Patient date of birth (praxis_patient.p_birth).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_birth";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/bloodPressureDiastolic.ttl b/NTO/Healthcare/attributes/bloodPressureDiastolic.ttl
new file mode 100644
index 00000000000..29af6427145
--- /dev/null
+++ b/NTO/Healthcare/attributes/bloodPressureDiastolic.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:bloodPressureDiastolic
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "bloodPressureDiastolic";
+ dcterms:description "Diastolic blood pressure in mmHg (pf_vital_bloodpressure.dia).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure.dia";
+ ogit:type "xsd:float";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/bloodPressureSystolic.ttl b/NTO/Healthcare/attributes/bloodPressureSystolic.ttl
new file mode 100644
index 00000000000..429f3ec3630
--- /dev/null
+++ b/NTO/Healthcare/attributes/bloodPressureSystolic.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:bloodPressureSystolic
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "bloodPressureSystolic";
+ dcterms:description "Systolic blood pressure in mmHg (pf_vital_bloodpressure.sys).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure.sys";
+ ogit:type "xsd:float";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/country.ttl b/NTO/Healthcare/attributes/country.ttl
new file mode 100644
index 00000000000..c7daf9a1163
--- /dev/null
+++ b/NTO/Healthcare/attributes/country.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:country
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "country";
+ dcterms:description "Patient country (praxis_patient.p_country).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_country";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/createDate.ttl b/NTO/Healthcare/attributes/createDate.ttl
new file mode 100644
index 00000000000..4c512f440da
--- /dev/null
+++ b/NTO/Healthcare/attributes/createDate.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:createDate
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "createDate";
+ dcterms:description "Entry creation timestamp (pf_diagnosis.d_createdate).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.d_createdate";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/datum.ttl b/NTO/Healthcare/attributes/datum.ttl
new file mode 100644
index 00000000000..4095837529e
--- /dev/null
+++ b/NTO/Healthcare/attributes/datum.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:datum
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "datum";
+ dcterms:description "Measurement timestamp (pf_vital_bloodpressure.datum).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure.datum";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/dbSourceDb.ttl b/NTO/Healthcare/attributes/dbSourceDb.ttl
new file mode 100644
index 00000000000..193aeb445de
--- /dev/null
+++ b/NTO/Healthcare/attributes/dbSourceDb.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:dbSourceDb
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "dbSourceDb";
+ dcterms:description "Provenance: name of the source database the row was imported from (pf_therapy.db_sourcedb).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_therapy.db_sourcedb";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/dbSourceId.ttl b/NTO/Healthcare/attributes/dbSourceId.ttl
new file mode 100644
index 00000000000..6e3990c0967
--- /dev/null
+++ b/NTO/Healthcare/attributes/dbSourceId.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:dbSourceId
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "dbSourceId";
+ dcterms:description "Provenance: row id in the source database (pf_therapy.db_sourceid).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_therapy.db_sourceid";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/dbSpezId.ttl b/NTO/Healthcare/attributes/dbSpezId.ttl
new file mode 100644
index 00000000000..5b325966c30
--- /dev/null
+++ b/NTO/Healthcare/attributes/dbSpezId.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:dbSpezId
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "dbSpezId";
+ dcterms:description "Specialty FK -> combo_spez.id (pf_diagnosis.db_spezid).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.db_spezid";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/ethnic.ttl b/NTO/Healthcare/attributes/ethnic.ttl
new file mode 100644
index 00000000000..5547b08f0dd
--- /dev/null
+++ b/NTO/Healthcare/attributes/ethnic.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:ethnic
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "ethnic";
+ dcterms:description "Self-declared ethnicity (praxis_patient.p_ethnic).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_ethnic";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileDate.ttl b/NTO/Healthcare/attributes/fileDate.ttl
new file mode 100644
index 00000000000..2670476671a
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileDate.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileDate
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileDate";
+ dcterms:description "Clinical event date the diagnosis refers to (pf_diagnosis.file_date).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_date";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileDiag.ttl b/NTO/Healthcare/attributes/fileDiag.ttl
new file mode 100644
index 00000000000..1b92d585755
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileDiag.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileDiag
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileDiag";
+ dcterms:description "Short diagnosis label (pf_diagnosis.file_diag).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_diag";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileIcd.ttl b/NTO/Healthcare/attributes/fileIcd.ttl
new file mode 100644
index 00000000000..bdfa1121165
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileIcd.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileIcd
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileIcd";
+ dcterms:description "ICD-10 code for the diagnosis (pf_diagnosis.file_icd).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_icd";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileKd.ttl b/NTO/Healthcare/attributes/fileKd.ttl
new file mode 100644
index 00000000000..5c2738745d6
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileKd.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileKd
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileKd";
+ dcterms:description "Chronic-diagnosis flag (pf_diagnosis.file_kd).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_kd";
+ ogit:type "xsd:boolean";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileKeyword.ttl b/NTO/Healthcare/attributes/fileKeyword.ttl
new file mode 100644
index 00000000000..1f931255c5c
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileKeyword.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileKeyword
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileKeyword";
+ dcterms:description "Therapy keyword / short label (pf_therapy.file_keyword).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_therapy.file_keyword";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileLd.ttl b/NTO/Healthcare/attributes/fileLd.ttl
new file mode 100644
index 00000000000..f8a5fc2ea28
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileLd.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileLd
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileLd";
+ dcterms:description "Leading-diagnosis flag (pf_diagnosis.file_ld).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_ld";
+ ogit:type "xsd:boolean";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileMedicineDose.ttl b/NTO/Healthcare/attributes/fileMedicineDose.ttl
new file mode 100644
index 00000000000..d44a17ec9e0
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileMedicineDose.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileMedicineDose
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileMedicineDose";
+ dcterms:description "Numeric per-administration dose (pat_medication.file_medicine_dose).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_medicine_dose";
+ ogit:type "xsd:float";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileMedicineName.ttl b/NTO/Healthcare/attributes/fileMedicineName.ttl
new file mode 100644
index 00000000000..fc2b312002e
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileMedicineName.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileMedicineName
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileMedicineName";
+ dcterms:description "Trade / display name of the medicine (pat_medication.file_medicine_name).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_medicine_name";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileMedicineTyp.ttl b/NTO/Healthcare/attributes/fileMedicineTyp.ttl
new file mode 100644
index 00000000000..fddf5937e67
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileMedicineTyp.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileMedicineTyp
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileMedicineTyp";
+ dcterms:description "Medicine type FK -> combo_medication_typ.id (pat_medication.file_medicine_typ).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_medicine_typ";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileNotice.ttl b/NTO/Healthcare/attributes/fileNotice.ttl
new file mode 100644
index 00000000000..18debb06d92
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileNotice.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileNotice
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileNotice";
+ dcterms:description "Free-text notice attached to the prescription (pat_medication.file_notice).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_notice";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/filePraepId.ttl b/NTO/Healthcare/attributes/filePraepId.ttl
new file mode 100644
index 00000000000..dae56d197fb
--- /dev/null
+++ b/NTO/Healthcare/attributes/filePraepId.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:filePraepId
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "filePraepId";
+ dcterms:description "Drug-product identifier in the medicines master (pat_medication.file_praepid).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_praepid";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileStart.ttl b/NTO/Healthcare/attributes/fileStart.ttl
new file mode 100644
index 00000000000..0fadca133f3
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileStart.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileStart
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileStart";
+ dcterms:description "Treatment start date (pat_medication.file_start).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_start";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileStop.ttl b/NTO/Healthcare/attributes/fileStop.ttl
new file mode 100644
index 00000000000..de1bfafabb5
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileStop.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileStop
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileStop";
+ dcterms:description "Treatment stop date (pat_medication.file_stop).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_stop";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/fileText.ttl b/NTO/Healthcare/attributes/fileText.ttl
new file mode 100644
index 00000000000..89b483cb456
--- /dev/null
+++ b/NTO/Healthcare/attributes/fileText.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:fileText
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fileText";
+ dcterms:description "Free-text clinical description (pf_diagnosis.file_Text).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_Text";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/findingSummary.ttl b/NTO/Healthcare/attributes/findingSummary.ttl
new file mode 100644
index 00000000000..a082f606e99
--- /dev/null
+++ b/NTO/Healthcare/attributes/findingSummary.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:findingSummary
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "findingSummary";
+ dcterms:description "Free-text or coded summary of the assessment's finding. Structured per-site findings are cascade-path nodes part_of the assessment, not a codebook slot.";
+ dcterms:source "SNOMED-CT:404684003";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/firstname.ttl b/NTO/Healthcare/attributes/firstname.ttl
new file mode 100644
index 00000000000..050d64f5db4
--- /dev/null
+++ b/NTO/Healthcare/attributes/firstname.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:firstname
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "firstname";
+ dcterms:description "Patient given name (praxis_patient.p_firstname).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_firstname";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/labId.ttl b/NTO/Healthcare/attributes/labId.ttl
new file mode 100644
index 00000000000..30255bd9116
--- /dev/null
+++ b/NTO/Healthcare/attributes/labId.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:labId
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "labId";
+ dcterms:description "Laboratory FK / partner identifier (pf_laboratory_values.labid).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_laboratory_values.labid";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/lastname.ttl b/NTO/Healthcare/attributes/lastname.ttl
new file mode 100644
index 00000000000..6f1bbc7f9b5
--- /dev/null
+++ b/NTO/Healthcare/attributes/lastname.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:lastname
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "lastname";
+ dcterms:description "Patient family name (praxis_patient.p_lastname).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_lastname";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/loginAt.ttl b/NTO/Healthcare/attributes/loginAt.ttl
new file mode 100644
index 00000000000..989f3fdaa28
--- /dev/null
+++ b/NTO/Healthcare/attributes/loginAt.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:loginAt
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "loginAt";
+ dcterms:description "Patient login time into waiting room (praxis_patient_waitingroom.p_login).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_login";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/logoutAt.ttl b/NTO/Healthcare/attributes/logoutAt.ttl
new file mode 100644
index 00000000000..3691b40b567
--- /dev/null
+++ b/NTO/Healthcare/attributes/logoutAt.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:logoutAt
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "logoutAt";
+ dcterms:description "Patient logout / visit-end time (praxis_patient_waitingroom.p_logout).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_logout";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/loincId.ttl b/NTO/Healthcare/attributes/loincId.ttl
new file mode 100644
index 00000000000..fcb4cf044ca
--- /dev/null
+++ b/NTO/Healthcare/attributes/loincId.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:loincId
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "loincId";
+ dcterms:description "LOINC reference code identifier (pf_laboratory_values.loincid).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_laboratory_values.loincid";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/loincRef.ttl b/NTO/Healthcare/attributes/loincRef.ttl
new file mode 100644
index 00000000000..924af7a4717
--- /dev/null
+++ b/NTO/Healthcare/attributes/loincRef.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:loincRef
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "loincRef";
+ dcterms:description "Out-of-namespace reference to LOINC concept. Carried as a property reference rather than an in-namespace entity since LOINC is governed externally.";
+ dcterms:source "loinc:";
+ ogit:type "xsd:anyURI";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/mail.ttl b/NTO/Healthcare/attributes/mail.ttl
new file mode 100644
index 00000000000..3d52b82a2a1
--- /dev/null
+++ b/NTO/Healthcare/attributes/mail.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:mail
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "mail";
+ dcterms:description "Patient email (praxis_patient.p_mail).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_mail";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/medicationDailyDose.ttl b/NTO/Healthcare/attributes/medicationDailyDose.ttl
new file mode 100644
index 00000000000..4e48432e99e
--- /dev/null
+++ b/NTO/Healthcare/attributes/medicationDailyDose.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:medicationDailyDose
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "medicationDailyDose";
+ dcterms:description "Daily-dose FK -> combo_medication_dailydose.id (pat_medication.pf_medication_dailydose).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.pf_medication_dailydose";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/medicationDoseUnit.ttl b/NTO/Healthcare/attributes/medicationDoseUnit.ttl
new file mode 100644
index 00000000000..8df7c3d3a61
--- /dev/null
+++ b/NTO/Healthcare/attributes/medicationDoseUnit.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:medicationDoseUnit
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "medicationDoseUnit";
+ dcterms:description "Dose-unit FK -> combo_medication_dose_unit.id (pat_medication.pf_medication_dose_unit).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.pf_medication_dose_unit";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/medicationInterval.ttl b/NTO/Healthcare/attributes/medicationInterval.ttl
new file mode 100644
index 00000000000..451478113fd
--- /dev/null
+++ b/NTO/Healthcare/attributes/medicationInterval.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:medicationInterval
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "medicationInterval";
+ dcterms:description "Interval-of-administration FK -> combo_medication_interval.id (pat_medication.pf_medication_interval).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.pf_medication_interval";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/medicationStopReason.ttl b/NTO/Healthcare/attributes/medicationStopReason.ttl
new file mode 100644
index 00000000000..662771fe1f2
--- /dev/null
+++ b/NTO/Healthcare/attributes/medicationStopReason.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:medicationStopReason
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "medicationStopReason";
+ dcterms:description "Stop-reason FK -> combo_medication_stop_reason.id (pat_medication.pf_medication_stop_reason).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.pf_medication_stop_reason";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/mobil.ttl b/NTO/Healthcare/attributes/mobil.ttl
new file mode 100644
index 00000000000..01ed0b99d3d
--- /dev/null
+++ b/NTO/Healthcare/attributes/mobil.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:mobil
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "mobil";
+ dcterms:description "Patient mobile phone (praxis_patient.p_mobil).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_mobil";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/noticeForDoc.ttl b/NTO/Healthcare/attributes/noticeForDoc.ttl
new file mode 100644
index 00000000000..0697a4cacb3
--- /dev/null
+++ b/NTO/Healthcare/attributes/noticeForDoc.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:noticeForDoc
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "noticeForDoc";
+ dcterms:description "Free-text reception notice for the doctor (praxis_patient_waitingroom.p_notice_for_doc).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_notice_for_doc";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/performedAt.ttl b/NTO/Healthcare/attributes/performedAt.ttl
new file mode 100644
index 00000000000..f41584be3c2
--- /dev/null
+++ b/NTO/Healthcare/attributes/performedAt.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:performedAt
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "performedAt";
+ dcterms:description "Timestamp at which the assessment was performed.";
+ dcterms:source "SNOMED-CT:386053000";
+ ogit:type "xsd:dateTime";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/place.ttl b/NTO/Healthcare/attributes/place.ttl
new file mode 100644
index 00000000000..956f36c9e97
--- /dev/null
+++ b/NTO/Healthcare/attributes/place.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:place
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "place";
+ dcterms:description "City / place of residence (praxis_patient.p_place).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_place";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/priority.ttl b/NTO/Healthcare/attributes/priority.ttl
new file mode 100644
index 00000000000..b3392fd8d58
--- /dev/null
+++ b/NTO/Healthcare/attributes/priority.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:priority
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "priority";
+ dcterms:description "Visit triage priority (praxis_patient_waitingroom.p_priority).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_priority";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/pulse.ttl b/NTO/Healthcare/attributes/pulse.ttl
new file mode 100644
index 00000000000..9e46ec19031
--- /dev/null
+++ b/NTO/Healthcare/attributes/pulse.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:pulse
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "pulse";
+ dcterms:description "Pulse rate (bpm) (pf_vital_bloodpressure.pulse).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure.pulse";
+ ogit:type "xsd:float";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/sexd.ttl b/NTO/Healthcare/attributes/sexd.ttl
new file mode 100644
index 00000000000..6fc20bc2b7f
--- /dev/null
+++ b/NTO/Healthcare/attributes/sexd.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:sexd
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "sexd";
+ dcterms:description "Boolean: patient identifies as diverse (praxis_patient.p_sexd).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_sexd";
+ ogit:type "xsd:boolean";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/sexf.ttl b/NTO/Healthcare/attributes/sexf.ttl
new file mode 100644
index 00000000000..4daae3da27a
--- /dev/null
+++ b/NTO/Healthcare/attributes/sexf.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:sexf
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "sexf";
+ dcterms:description "Boolean: patient identifies as female (praxis_patient.p_sexf).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_sexf";
+ ogit:type "xsd:boolean";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/sexm.ttl b/NTO/Healthcare/attributes/sexm.ttl
new file mode 100644
index 00000000000..2235b16dbac
--- /dev/null
+++ b/NTO/Healthcare/attributes/sexm.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:sexm
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "sexm";
+ dcterms:description "Boolean: patient identifies as male (praxis_patient.p_sexm).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_sexm";
+ ogit:type "xsd:boolean";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/spez.ttl b/NTO/Healthcare/attributes/spez.ttl
new file mode 100644
index 00000000000..3c1ea318c1b
--- /dev/null
+++ b/NTO/Healthcare/attributes/spez.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:spez
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "spez";
+ dcterms:description "Specialty / profile assigned to the patient (praxis_patient.p_spez).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_spez";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/street.ttl b/NTO/Healthcare/attributes/street.ttl
new file mode 100644
index 00000000000..ce5619d42c8
--- /dev/null
+++ b/NTO/Healthcare/attributes/street.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:street
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "street";
+ dcterms:description "Street address (praxis_patient.p_street).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_street";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/timeInWaiting.ttl b/NTO/Healthcare/attributes/timeInWaiting.ttl
new file mode 100644
index 00000000000..ea71d5163eb
--- /dev/null
+++ b/NTO/Healthcare/attributes/timeInWaiting.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:timeInWaiting
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "timeInWaiting";
+ dcterms:description "Computed waiting duration in minutes (praxis_patient_waitingroom.p_time_in_waiting).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_time_in_waiting";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/title1.ttl b/NTO/Healthcare/attributes/title1.ttl
new file mode 100644
index 00000000000..3441dcef8d5
--- /dev/null
+++ b/NTO/Healthcare/attributes/title1.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:title1
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "title1";
+ dcterms:description "Honorific title (praxis_patient.p_title1).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_title1";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/title2.ttl b/NTO/Healthcare/attributes/title2.ttl
new file mode 100644
index 00000000000..a206b20b053
--- /dev/null
+++ b/NTO/Healthcare/attributes/title2.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:title2
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "title2";
+ dcterms:description "Academic title (praxis_patient.p_title2).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_title2";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/toDocId.ttl b/NTO/Healthcare/attributes/toDocId.ttl
new file mode 100644
index 00000000000..a8d304ad2c2
--- /dev/null
+++ b/NTO/Healthcare/attributes/toDocId.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:toDocId
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "toDocId";
+ dcterms:description "Doctor assigned to handle the visit (praxis_patient_waitingroom.p_to_doc_id).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_to_doc_id";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/waitingroomId.ttl b/NTO/Healthcare/attributes/waitingroomId.ttl
new file mode 100644
index 00000000000..50293cfa047
--- /dev/null
+++ b/NTO/Healthcare/attributes/waitingroomId.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:waitingroomId
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "waitingroomId";
+ dcterms:description "FK to praxis_waitingroom (praxis_patient_waitingroom.praxis_waitingroomid).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.praxis_waitingroomid";
+ ogit:type "xsd:integer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/werte.ttl b/NTO/Healthcare/attributes/werte.ttl
new file mode 100644
index 00000000000..7e453ef0b24
--- /dev/null
+++ b/NTO/Healthcare/attributes/werte.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:werte
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "werte";
+ dcterms:description "Numeric measured value (pf_laboratory_values.werte).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_laboratory_values.werte";
+ ogit:type "xsd:float";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/attributes/zip.ttl b/NTO/Healthcare/attributes/zip.ttl
new file mode 100644
index 00000000000..10ce6b157c8
--- /dev/null
+++ b/NTO/Healthcare/attributes/zip.ttl
@@ -0,0 +1,16 @@
+@prefix ogit.Healthcare: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:zip
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "zip";
+ dcterms:description "Postal code (praxis_patient.p_zip).";
+ dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_zip";
+ ogit:type "xsd:string";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/Healthcare/entities/AnatomicalStructure.ttl b/NTO/Healthcare/entities/AnatomicalStructure.ttl
new file mode 100644
index 00000000000..c530dcf1e07
--- /dev/null
+++ b/NTO/Healthcare/entities/AnatomicalStructure.ttl
@@ -0,0 +1,26 @@
+@prefix ogit: .
+@prefix ogit.Healthcare: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:AnatomicalStructure
+ a rdfs:Class;
+ rdfs:subClassOf ogit:Entity;
+ rdfs:label "AnatomicalStructure";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:description "A part of the body that an assessment evaluates, such as an organ or a joint. Identified by an external anatomy reference.";
+ dcterms:creator "claude-ogit-bootstrap";
+ ogit:scope "NTO";
+ ogit:parent ogit:Node;
+ ogit:mandatory-attributes (
+ ogit:id
+ ogit:name
+ );
+ ogit:optional-attributes (
+ );
+ ogit:indexed-attributes (
+ ogit:name
+ );
+ ogit:allowed (
+ );
+.
diff --git a/NTO/Healthcare/entities/Assessment.ttl b/NTO/Healthcare/entities/Assessment.ttl
index 28dcdbc7c44..03343313ff7 100644
--- a/NTO/Healthcare/entities/Assessment.ttl
+++ b/NTO/Healthcare/entities/Assessment.ttl
@@ -19,6 +19,7 @@ ogit.Healthcare:Assessment
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "Assessment";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "A diagnostic evaluation act that produces findings about an anatomical structure. Modality-agnostic root: an assessment is performed by some modality (its is_a subclass) and evaluates some anatomical structure (its part_of grounding).";
dcterms:source "SNOMED-CT:386053000";
dcterms:creator "claude-ogit-bootstrap";
@@ -35,67 +36,7 @@ ogit.Healthcare:Assessment
ogit.Healthcare:performedAt
);
ogit:allowed (
- [ ogit:assesses ogit.Healthcare:AnatomicalStructure ]
+ [ ogit.Healthcare:assesses ogit.Healthcare:AnatomicalStructure ]
[ ogit:belongs ogit.Healthcare:Patient ]
);
.
-
-# ── is_a rail — the modality taxonomy (each modality is-a Assessment) ──
-
-ogit.Healthcare:SonographicAssessment
- a rdfs:Class;
- rdfs:subClassOf ogit.Healthcare:Assessment;
- rdfs:label "SonographicAssessment";
- dcterms:description "An assessment performed by ultrasound (sonography). Reusable across any sonographic examination; the assessed structure is fixed by the part_of grounding (e.g. a joint, an abdomen), never by the modality.";
- dcterms:source "SNOMED-CT:16310003";
- dcterms:creator "claude-ogit-bootstrap";
- ogit:scope "NTO";
- ogit:parent ogit.Healthcare:Assessment;
- ogit:allowed (
- [ ogit:assesses ogit.Healthcare:AnatomicalStructure ]
- );
-.
-
-ogit.Healthcare:MriAssessment
- a rdfs:Class;
- rdfs:subClassOf ogit.Healthcare:Assessment;
- rdfs:label "MriAssessment";
- dcterms:description "An assessment performed by magnetic-resonance imaging. Same reusable shape as SonographicAssessment — a different modality over the identical anatomy grounding.";
- dcterms:source "SNOMED-CT:113091000";
- dcterms:creator "claude-ogit-bootstrap";
- ogit:scope "NTO";
- ogit:parent ogit.Healthcare:Assessment;
- ogit:allowed (
- [ ogit:assesses ogit.Healthcare:AnatomicalStructure ]
- );
-.
-
-ogit.Healthcare:HistologicAssessment
- a rdfs:Class;
- rdfs:subClassOf ogit.Healthcare:Assessment;
- rdfs:label "HistologicAssessment";
- dcterms:description "An assessment performed by histopathological examination of tissue. The third modality sibling; reuses the Assessment root and the anatomy grounding at zero additional shape cost.";
- dcterms:source "SNOMED-CT:250537006";
- dcterms:creator "claude-ogit-bootstrap";
- ogit:scope "NTO";
- ogit:parent ogit.Healthcare:Assessment;
- ogit:allowed (
- [ ogit:assesses ogit.Healthcare:AnatomicalStructure ]
- );
-.
-
-# ── shared agnostic properties ──
-
-ogit.Healthcare:performedAt
- a ogit:Property;
- rdfs:label "performedAt";
- dcterms:description "Timestamp at which the assessment was performed.";
- dcterms:source "SNOMED-CT:386053000";
- ogit:type "xsd:dateTime" .
-
-ogit.Healthcare:findingSummary
- a ogit:Property;
- rdfs:label "findingSummary";
- dcterms:description "Free-text or coded summary of the assessment's finding. Structured per-site findings are cascade-path nodes part_of the assessment, not a codebook slot.";
- dcterms:source "SNOMED-CT:404684003";
- ogit:type "xsd:string" .
diff --git a/NTO/Healthcare/entities/Diagnosis.ttl b/NTO/Healthcare/entities/Diagnosis.ttl
index 31865491743..c442adfc795 100644
--- a/NTO/Healthcare/entities/Diagnosis.ttl
+++ b/NTO/Healthcare/entities/Diagnosis.ttl
@@ -9,6 +9,7 @@ ogit.Healthcare:Diagnosis
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "Diagnosis";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "A clinical diagnosis attached to a patient (and optionally a visit). Carries ICD code, free-text diagnosis description, leading-diagnosis and chronic flags. Source-of-truth: pf_diagnosis (17 cols).";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis";
dcterms:creator "claude-ogit-bootstrap";
@@ -37,59 +38,3 @@ ogit.Healthcare:Diagnosis
[ ogit:relates ogit.Healthcare:Visit ]
);
.
-
-ogit.Healthcare:fileIcd
- a ogit:Property;
- rdfs:label "fileIcd";
- dcterms:description "ICD-10 code for the diagnosis (pf_diagnosis.file_icd).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_icd";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:fileDiag
- a ogit:Property;
- rdfs:label "fileDiag";
- dcterms:description "Short diagnosis label (pf_diagnosis.file_diag).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_diag";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:fileText
- a ogit:Property;
- rdfs:label "fileText";
- dcterms:description "Free-text clinical description (pf_diagnosis.file_Text).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_Text";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:createDate
- a ogit:Property;
- rdfs:label "createDate";
- dcterms:description "Entry creation timestamp (pf_diagnosis.d_createdate).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.d_createdate";
- ogit:type "xsd:dateTime" .
-
-ogit.Healthcare:dbSpezId
- a ogit:Property;
- rdfs:label "dbSpezId";
- dcterms:description "Specialty FK -> combo_spez.id (pf_diagnosis.db_spezid).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.db_spezid";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:fileLd
- a ogit:Property;
- rdfs:label "fileLd";
- dcterms:description "Leading-diagnosis flag (pf_diagnosis.file_ld).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_ld";
- ogit:type "xsd:boolean" .
-
-ogit.Healthcare:fileKd
- a ogit:Property;
- rdfs:label "fileKd";
- dcterms:description "Chronic-diagnosis flag (pf_diagnosis.file_kd).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_kd";
- ogit:type "xsd:boolean" .
-
-ogit.Healthcare:fileDate
- a ogit:Property;
- rdfs:label "fileDate";
- dcterms:description "Clinical event date the diagnosis refers to (pf_diagnosis.file_date).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_diagnosis.file_date";
- ogit:type "xsd:dateTime" .
diff --git a/NTO/Healthcare/entities/HistologicAssessment.ttl b/NTO/Healthcare/entities/HistologicAssessment.ttl
new file mode 100644
index 00000000000..20ed42a2d08
--- /dev/null
+++ b/NTO/Healthcare/entities/HistologicAssessment.ttl
@@ -0,0 +1,20 @@
+@prefix ogit: .
+@prefix ogit.Healthcare: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+@prefix xsd: .
+
+ogit.Healthcare:HistologicAssessment
+ a rdfs:Class;
+ rdfs:subClassOf ogit.Healthcare:Assessment;
+ rdfs:label "HistologicAssessment";
+ dcterms:description "An assessment performed by histopathological examination of tissue. The third modality sibling; reuses the Assessment root and the anatomy grounding at zero additional shape cost.";
+ dcterms:source "SNOMED-CT:250537006";
+ dcterms:creator "claude-ogit-bootstrap";
+ ogit:scope "NTO";
+ ogit:parent ogit.Healthcare:Assessment;
+ ogit:allowed (
+ [ ogit.Healthcare:assesses ogit.Healthcare:AnatomicalStructure ]
+ );
+.
diff --git a/NTO/Healthcare/entities/LabValue.ttl b/NTO/Healthcare/entities/LabValue.ttl
index d2e2cc63bbc..5b004f6abbd 100644
--- a/NTO/Healthcare/entities/LabValue.ttl
+++ b/NTO/Healthcare/entities/LabValue.ttl
@@ -9,6 +9,7 @@ ogit.Healthcare:LabValue
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "LabValue";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "A laboratory measurement for a patient. LOINC-coded test (loincid) with a numeric value (werte) and lab-internal id. Source-of-truth: pf_laboratory_values (9 cols).";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_laboratory_values";
dcterms:creator "claude-ogit-bootstrap";
@@ -22,6 +23,7 @@ ogit.Healthcare:LabValue
ogit.Healthcare:labId
ogit.Healthcare:loincId
ogit.Healthcare:werte
+ ogit.Healthcare:loincRef
);
ogit:indexed-attributes (
ogit.Healthcare:createDate
@@ -29,34 +31,5 @@ ogit.Healthcare:LabValue
);
ogit:allowed (
[ ogit:belongs ogit.Healthcare:Patient ]
- [ ogit:relates ogit.Healthcare:loincRef ]
);
.
-
-ogit.Healthcare:labId
- a ogit:Property;
- rdfs:label "labId";
- dcterms:description "Laboratory FK / partner identifier (pf_laboratory_values.labid).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_laboratory_values.labid";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:loincId
- a ogit:Property;
- rdfs:label "loincId";
- dcterms:description "LOINC reference code identifier (pf_laboratory_values.loincid).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_laboratory_values.loincid";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:werte
- a ogit:Property;
- rdfs:label "werte";
- dcterms:description "Numeric measured value (pf_laboratory_values.werte).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_laboratory_values.werte";
- ogit:type "xsd:float" .
-
-ogit.Healthcare:loincRef
- a ogit:Property;
- rdfs:label "loincRef";
- dcterms:description "Out-of-namespace reference to LOINC concept. Carried as a property reference rather than an in-namespace entity since LOINC is governed externally.";
- dcterms:source "loinc:";
- ogit:type "xsd:anyURI" .
diff --git a/NTO/Healthcare/entities/Medication.ttl b/NTO/Healthcare/entities/Medication.ttl
index f27b605fc74..e7cf0e8e616 100644
--- a/NTO/Healthcare/entities/Medication.ttl
+++ b/NTO/Healthcare/entities/Medication.ttl
@@ -9,6 +9,7 @@ ogit.Healthcare:Medication
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "Medication";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "A prescribed / dispensed medication for a patient. Carries product id, dose, interval, daily dose, dose unit, stop reason, start/stop dates. Source-of-truth: pat_medication (25 cols).";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication";
dcterms:creator "claude-ogit-bootstrap";
@@ -45,80 +46,3 @@ ogit.Healthcare:Medication
[ ogit:relates ogit.Healthcare:combo_medication_stop_reason ]
);
.
-
-ogit.Healthcare:filePraepId
- a ogit:Property;
- rdfs:label "filePraepId";
- dcterms:description "Drug-product identifier in the medicines master (pat_medication.file_praepid).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_praepid";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:fileMedicineName
- a ogit:Property;
- rdfs:label "fileMedicineName";
- dcterms:description "Trade / display name of the medicine (pat_medication.file_medicine_name).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_medicine_name";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:fileMedicineDose
- a ogit:Property;
- rdfs:label "fileMedicineDose";
- dcterms:description "Numeric per-administration dose (pat_medication.file_medicine_dose).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_medicine_dose";
- ogit:type "xsd:float" .
-
-ogit.Healthcare:fileMedicineTyp
- a ogit:Property;
- rdfs:label "fileMedicineTyp";
- dcterms:description "Medicine type FK -> combo_medication_typ.id (pat_medication.file_medicine_typ).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_medicine_typ";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:fileStart
- a ogit:Property;
- rdfs:label "fileStart";
- dcterms:description "Treatment start date (pat_medication.file_start).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_start";
- ogit:type "xsd:dateTime" .
-
-ogit.Healthcare:fileStop
- a ogit:Property;
- rdfs:label "fileStop";
- dcterms:description "Treatment stop date (pat_medication.file_stop).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_stop";
- ogit:type "xsd:dateTime" .
-
-ogit.Healthcare:fileNotice
- a ogit:Property;
- rdfs:label "fileNotice";
- dcterms:description "Free-text notice attached to the prescription (pat_medication.file_notice).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.file_notice";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:medicationInterval
- a ogit:Property;
- rdfs:label "medicationInterval";
- dcterms:description "Interval-of-administration FK -> combo_medication_interval.id (pat_medication.pf_medication_interval).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.pf_medication_interval";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:medicationDailyDose
- a ogit:Property;
- rdfs:label "medicationDailyDose";
- dcterms:description "Daily-dose FK -> combo_medication_dailydose.id (pat_medication.pf_medication_dailydose).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.pf_medication_dailydose";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:medicationStopReason
- a ogit:Property;
- rdfs:label "medicationStopReason";
- dcterms:description "Stop-reason FK -> combo_medication_stop_reason.id (pat_medication.pf_medication_stop_reason).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.pf_medication_stop_reason";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:medicationDoseUnit
- a ogit:Property;
- rdfs:label "medicationDoseUnit";
- dcterms:description "Dose-unit FK -> combo_medication_dose_unit.id (pat_medication.pf_medication_dose_unit).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pat_medication.pf_medication_dose_unit";
- ogit:type "xsd:integer" .
diff --git a/NTO/Healthcare/entities/MriAssessment.ttl b/NTO/Healthcare/entities/MriAssessment.ttl
new file mode 100644
index 00000000000..cf3bfc719db
--- /dev/null
+++ b/NTO/Healthcare/entities/MriAssessment.ttl
@@ -0,0 +1,20 @@
+@prefix ogit: .
+@prefix ogit.Healthcare: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+@prefix xsd: .
+
+ogit.Healthcare:MriAssessment
+ a rdfs:Class;
+ rdfs:subClassOf ogit.Healthcare:Assessment;
+ rdfs:label "MriAssessment";
+ dcterms:description "An assessment performed by magnetic-resonance imaging. Same reusable shape as SonographicAssessment — a different modality over the identical anatomy grounding.";
+ dcterms:source "SNOMED-CT:113091000";
+ dcterms:creator "claude-ogit-bootstrap";
+ ogit:scope "NTO";
+ ogit:parent ogit.Healthcare:Assessment;
+ ogit:allowed (
+ [ ogit.Healthcare:assesses ogit.Healthcare:AnatomicalStructure ]
+ );
+.
diff --git a/NTO/Healthcare/entities/Patient.ttl b/NTO/Healthcare/entities/Patient.ttl
index 93d94b6ed8b..1c0d678dbe0 100644
--- a/NTO/Healthcare/entities/Patient.ttl
+++ b/NTO/Healthcare/entities/Patient.ttl
@@ -9,6 +9,7 @@ ogit.Healthcare:Patient
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "Patient";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "A patient record in a clinical practice. Identified by an internal id, scoped to a tenant (clinic), with demographic, contact, and specialty fields. Source-of-truth: praxis_patient (30 cols).";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient";
dcterms:creator "claude-ogit-bootstrap";
@@ -35,6 +36,7 @@ ogit.Healthcare:Patient
ogit.Healthcare:title1
ogit.Healthcare:title2
ogit.Healthcare:anomize
+ ogit:tenantId
);
ogit:indexed-attributes (
ogit.Healthcare:lastname
@@ -42,125 +44,5 @@ ogit.Healthcare:Patient
ogit.Healthcare:mail
);
ogit:allowed (
- [ ogit:belongs ogit:Tenant ]
);
.
-
-ogit.Healthcare:firstname
- a ogit:Property;
- rdfs:label "firstname";
- dcterms:description "Patient given name (praxis_patient.p_firstname).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_firstname";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:lastname
- a ogit:Property;
- rdfs:label "lastname";
- dcterms:description "Patient family name (praxis_patient.p_lastname).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_lastname";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:birth
- a ogit:Property;
- rdfs:label "birth";
- dcterms:description "Patient date of birth (praxis_patient.p_birth).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_birth";
- ogit:type "xsd:dateTime" .
-
-ogit.Healthcare:sexm
- a ogit:Property;
- rdfs:label "sexm";
- dcterms:description "Boolean: patient identifies as male (praxis_patient.p_sexm).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_sexm";
- ogit:type "xsd:boolean" .
-
-ogit.Healthcare:sexf
- a ogit:Property;
- rdfs:label "sexf";
- dcterms:description "Boolean: patient identifies as female (praxis_patient.p_sexf).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_sexf";
- ogit:type "xsd:boolean" .
-
-ogit.Healthcare:sexd
- a ogit:Property;
- rdfs:label "sexd";
- dcterms:description "Boolean: patient identifies as diverse (praxis_patient.p_sexd).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_sexd";
- ogit:type "xsd:boolean" .
-
-ogit.Healthcare:ethnic
- a ogit:Property;
- rdfs:label "ethnic";
- dcterms:description "Self-declared ethnicity (praxis_patient.p_ethnic).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_ethnic";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:mail
- a ogit:Property;
- rdfs:label "mail";
- dcterms:description "Patient email (praxis_patient.p_mail).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_mail";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:mobil
- a ogit:Property;
- rdfs:label "mobil";
- dcterms:description "Patient mobile phone (praxis_patient.p_mobil).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_mobil";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:country
- a ogit:Property;
- rdfs:label "country";
- dcterms:description "Patient country (praxis_patient.p_country).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_country";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:zip
- a ogit:Property;
- rdfs:label "zip";
- dcterms:description "Postal code (praxis_patient.p_zip).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_zip";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:place
- a ogit:Property;
- rdfs:label "place";
- dcterms:description "City / place of residence (praxis_patient.p_place).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_place";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:street
- a ogit:Property;
- rdfs:label "street";
- dcterms:description "Street address (praxis_patient.p_street).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_street";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:spez
- a ogit:Property;
- rdfs:label "spez";
- dcterms:description "Specialty / profile assigned to the patient (praxis_patient.p_spez).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_spez";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:title1
- a ogit:Property;
- rdfs:label "title1";
- dcterms:description "Honorific title (praxis_patient.p_title1).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_title1";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:title2
- a ogit:Property;
- rdfs:label "title2";
- dcterms:description "Academic title (praxis_patient.p_title2).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_title2";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:anomize
- a ogit:Property;
- rdfs:label "anomize";
- dcterms:description "Anonymisation flag for research export (praxis_patient.p_anomize).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient.p_anomize";
- ogit:type "xsd:boolean" .
diff --git a/NTO/Healthcare/entities/SonographicAssessment.ttl b/NTO/Healthcare/entities/SonographicAssessment.ttl
new file mode 100644
index 00000000000..7b527fbaa56
--- /dev/null
+++ b/NTO/Healthcare/entities/SonographicAssessment.ttl
@@ -0,0 +1,20 @@
+@prefix ogit: .
+@prefix ogit.Healthcare: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+@prefix xsd: .
+
+ogit.Healthcare:SonographicAssessment
+ a rdfs:Class;
+ rdfs:subClassOf ogit.Healthcare:Assessment;
+ rdfs:label "SonographicAssessment";
+ dcterms:description "An assessment performed by ultrasound (sonography). Reusable across any sonographic examination; the assessed structure is fixed by the part_of grounding (e.g. a joint, an abdomen), never by the modality.";
+ dcterms:source "SNOMED-CT:16310003";
+ dcterms:creator "claude-ogit-bootstrap";
+ ogit:scope "NTO";
+ ogit:parent ogit.Healthcare:Assessment;
+ ogit:allowed (
+ [ ogit.Healthcare:assesses ogit.Healthcare:AnatomicalStructure ]
+ );
+.
diff --git a/NTO/Healthcare/entities/Treatment.ttl b/NTO/Healthcare/entities/Treatment.ttl
index 2379c82542b..53db322d4a7 100644
--- a/NTO/Healthcare/entities/Treatment.ttl
+++ b/NTO/Healthcare/entities/Treatment.ttl
@@ -9,6 +9,7 @@ ogit.Healthcare:Treatment
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "Treatment";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "A therapy / treatment record attached to a patient. Free-text-driven (keyword + Text), provenance-aware (db_sourcedb). Source-of-truth: pf_therapy (16 cols).";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_therapy";
dcterms:creator "claude-ogit-bootstrap";
@@ -34,24 +35,3 @@ ogit.Healthcare:Treatment
[ ogit:belongs ogit.Healthcare:Patient ]
);
.
-
-ogit.Healthcare:fileKeyword
- a ogit:Property;
- rdfs:label "fileKeyword";
- dcterms:description "Therapy keyword / short label (pf_therapy.file_keyword).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_therapy.file_keyword";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:dbSourceDb
- a ogit:Property;
- rdfs:label "dbSourceDb";
- dcterms:description "Provenance: name of the source database the row was imported from (pf_therapy.db_sourcedb).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_therapy.db_sourcedb";
- ogit:type "xsd:string" .
-
-ogit.Healthcare:dbSourceId
- a ogit:Property;
- rdfs:label "dbSourceId";
- dcterms:description "Provenance: row id in the source database (pf_therapy.db_sourceid).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_therapy.db_sourceid";
- ogit:type "xsd:integer" .
diff --git a/NTO/Healthcare/entities/Visit.ttl b/NTO/Healthcare/entities/Visit.ttl
index acb5afaa6db..23403efdd58 100644
--- a/NTO/Healthcare/entities/Visit.ttl
+++ b/NTO/Healthcare/entities/Visit.ttl
@@ -9,6 +9,7 @@ ogit.Healthcare:Visit
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "Visit";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "A patient visit / waiting-room session — login, doctor assignment, priority, time-in-waiting and logout. Source-of-truth: praxis_patient_waitingroom.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom";
dcterms:creator "claude-ogit-bootstrap";
@@ -35,52 +36,3 @@ ogit.Healthcare:Visit
[ ogit:belongs ogit.Healthcare:Patient ]
);
.
-
-ogit.Healthcare:waitingroomId
- a ogit:Property;
- rdfs:label "waitingroomId";
- dcterms:description "FK to praxis_waitingroom (praxis_patient_waitingroom.praxis_waitingroomid).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.praxis_waitingroomid";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:toDocId
- a ogit:Property;
- rdfs:label "toDocId";
- dcterms:description "Doctor assigned to handle the visit (praxis_patient_waitingroom.p_to_doc_id).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_to_doc_id";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:loginAt
- a ogit:Property;
- rdfs:label "loginAt";
- dcterms:description "Patient login time into waiting room (praxis_patient_waitingroom.p_login).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_login";
- ogit:type "xsd:dateTime" .
-
-ogit.Healthcare:logoutAt
- a ogit:Property;
- rdfs:label "logoutAt";
- dcterms:description "Patient logout / visit-end time (praxis_patient_waitingroom.p_logout).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_logout";
- ogit:type "xsd:dateTime" .
-
-ogit.Healthcare:timeInWaiting
- a ogit:Property;
- rdfs:label "timeInWaiting";
- dcterms:description "Computed waiting duration in minutes (praxis_patient_waitingroom.p_time_in_waiting).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_time_in_waiting";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:priority
- a ogit:Property;
- rdfs:label "priority";
- dcterms:description "Visit triage priority (praxis_patient_waitingroom.p_priority).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_priority";
- ogit:type "xsd:integer" .
-
-ogit.Healthcare:noticeForDoc
- a ogit:Property;
- rdfs:label "noticeForDoc";
- dcterms:description "Free-text reception notice for the doctor (praxis_patient_waitingroom.p_notice_for_doc).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:praxis_patient_waitingroom.p_notice_for_doc";
- ogit:type "xsd:string" .
diff --git a/NTO/Healthcare/entities/VitalSign.ttl b/NTO/Healthcare/entities/VitalSign.ttl
index 4e0c9445351..43919f39868 100644
--- a/NTO/Healthcare/entities/VitalSign.ttl
+++ b/NTO/Healthcare/entities/VitalSign.ttl
@@ -9,6 +9,7 @@ ogit.Healthcare:VitalSign
a rdfs:Class;
rdfs:subClassOf ogit:Entity;
rdfs:label "VitalSign";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "A patient vital-sign measurement. Modelled here as the base class for the pf_vital_* family — the canonical / minimal source-of-truth is pf_vital_bloodpressure (id, pid, datum, sys, dia, pulse). Subclasses (pf_vital_dynmodule, pf_vital_temperature, etc.) extend with module-specific columns.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure";
dcterms:creator "claude-ogit-bootstrap";
@@ -30,31 +31,3 @@ ogit.Healthcare:VitalSign
[ ogit:belongs ogit.Healthcare:Patient ]
);
.
-
-ogit.Healthcare:datum
- a ogit:Property;
- rdfs:label "datum";
- dcterms:description "Measurement timestamp (pf_vital_bloodpressure.datum).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure.datum";
- ogit:type "xsd:dateTime" .
-
-ogit.Healthcare:bloodPressureSystolic
- a ogit:Property;
- rdfs:label "bloodPressureSystolic";
- dcterms:description "Systolic blood pressure in mmHg (pf_vital_bloodpressure.sys).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure.sys";
- ogit:type "xsd:float" .
-
-ogit.Healthcare:bloodPressureDiastolic
- a ogit:Property;
- rdfs:label "bloodPressureDiastolic";
- dcterms:description "Diastolic blood pressure in mmHg (pf_vital_bloodpressure.dia).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure.dia";
- ogit:type "xsd:float" .
-
-ogit.Healthcare:pulse
- a ogit:Property;
- rdfs:label "pulse";
- dcterms:description "Pulse rate (bpm) (pf_vital_bloodpressure.pulse).";
- dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:pf_vital_bloodpressure.pulse";
- ogit:type "xsd:float" .
diff --git a/NTO/Healthcare/enumerations/combo_addtreatment.ttl b/NTO/Healthcare/entities/combo_addtreatment.ttl
similarity index 93%
rename from NTO/Healthcare/enumerations/combo_addtreatment.ttl
rename to NTO/Healthcare/entities/combo_addtreatment.ttl
index f7b7eb15e61..6c8094a8639 100644
--- a/NTO/Healthcare/enumerations/combo_addtreatment.ttl
+++ b/NTO/Healthcare/entities/combo_addtreatment.ttl
@@ -7,8 +7,9 @@
ogit.Healthcare:combo_addtreatment
a rdfs:Class;
- rdfs:subClassOf ogit:Enumeration;
+ rdfs:subClassOf ogit:Entity;
rdfs:label "combo_addtreatment";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "Enumeration of additional-treatment categories attached to a clinical record. Values populated as a follow-on import from MedCare-rs.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:combo_addtreatment";
dcterms:creator "claude-ogit-bootstrap";
diff --git a/NTO/Healthcare/enumerations/combo_medication_dailydose.ttl b/NTO/Healthcare/entities/combo_medication_dailydose.ttl
similarity index 93%
rename from NTO/Healthcare/enumerations/combo_medication_dailydose.ttl
rename to NTO/Healthcare/entities/combo_medication_dailydose.ttl
index 27a37ae8cf2..f8007a6ed80 100644
--- a/NTO/Healthcare/enumerations/combo_medication_dailydose.ttl
+++ b/NTO/Healthcare/entities/combo_medication_dailydose.ttl
@@ -7,8 +7,9 @@
ogit.Healthcare:combo_medication_dailydose
a rdfs:Class;
- rdfs:subClassOf ogit:Enumeration;
+ rdfs:subClassOf ogit:Entity;
rdfs:label "combo_medication_dailydose";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "Enumeration of medication daily-dose patterns. Values populated as a follow-on import from MedCare-rs.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:combo_medication_dailydose";
dcterms:creator "claude-ogit-bootstrap";
diff --git a/NTO/Healthcare/enumerations/combo_medication_dose_unit.ttl b/NTO/Healthcare/entities/combo_medication_dose_unit.ttl
similarity index 93%
rename from NTO/Healthcare/enumerations/combo_medication_dose_unit.ttl
rename to NTO/Healthcare/entities/combo_medication_dose_unit.ttl
index b2b4e57c971..fbeb11c198a 100644
--- a/NTO/Healthcare/enumerations/combo_medication_dose_unit.ttl
+++ b/NTO/Healthcare/entities/combo_medication_dose_unit.ttl
@@ -7,8 +7,9 @@
ogit.Healthcare:combo_medication_dose_unit
a rdfs:Class;
- rdfs:subClassOf ogit:Enumeration;
+ rdfs:subClassOf ogit:Entity;
rdfs:label "combo_medication_dose_unit";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "Enumeration of medication dose units (mg, ml, IU, etc.). Values populated as a follow-on import from MedCare-rs.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:combo_medication_dose_unit";
dcterms:creator "claude-ogit-bootstrap";
diff --git a/NTO/Healthcare/enumerations/combo_medication_interval.ttl b/NTO/Healthcare/entities/combo_medication_interval.ttl
similarity index 93%
rename from NTO/Healthcare/enumerations/combo_medication_interval.ttl
rename to NTO/Healthcare/entities/combo_medication_interval.ttl
index 57e7d33ae8c..66140964810 100644
--- a/NTO/Healthcare/enumerations/combo_medication_interval.ttl
+++ b/NTO/Healthcare/entities/combo_medication_interval.ttl
@@ -7,8 +7,9 @@
ogit.Healthcare:combo_medication_interval
a rdfs:Class;
- rdfs:subClassOf ogit:Enumeration;
+ rdfs:subClassOf ogit:Entity;
rdfs:label "combo_medication_interval";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "Enumeration of medication administration intervals (e.g. once-a-day, twice-a-day, weekly). Values populated as a follow-on import from MedCare-rs.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:combo_medication_interval";
dcterms:creator "claude-ogit-bootstrap";
diff --git a/NTO/Healthcare/enumerations/combo_medication_stop_reason.ttl b/NTO/Healthcare/entities/combo_medication_stop_reason.ttl
similarity index 93%
rename from NTO/Healthcare/enumerations/combo_medication_stop_reason.ttl
rename to NTO/Healthcare/entities/combo_medication_stop_reason.ttl
index d787d1dc6c6..f8b4357fbbc 100644
--- a/NTO/Healthcare/enumerations/combo_medication_stop_reason.ttl
+++ b/NTO/Healthcare/entities/combo_medication_stop_reason.ttl
@@ -7,8 +7,9 @@
ogit.Healthcare:combo_medication_stop_reason
a rdfs:Class;
- rdfs:subClassOf ogit:Enumeration;
+ rdfs:subClassOf ogit:Entity;
rdfs:label "combo_medication_stop_reason";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "Enumeration of reasons for stopping a medication (cured, side-effect, replaced, etc.). Values populated as a follow-on import from MedCare-rs.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:combo_medication_stop_reason";
dcterms:creator "claude-ogit-bootstrap";
diff --git a/NTO/Healthcare/enumerations/combo_medication_typ.ttl b/NTO/Healthcare/entities/combo_medication_typ.ttl
similarity index 93%
rename from NTO/Healthcare/enumerations/combo_medication_typ.ttl
rename to NTO/Healthcare/entities/combo_medication_typ.ttl
index ccbab9fcac2..70135afdb10 100644
--- a/NTO/Healthcare/enumerations/combo_medication_typ.ttl
+++ b/NTO/Healthcare/entities/combo_medication_typ.ttl
@@ -7,8 +7,9 @@
ogit.Healthcare:combo_medication_typ
a rdfs:Class;
- rdfs:subClassOf ogit:Enumeration;
+ rdfs:subClassOf ogit:Entity;
rdfs:label "combo_medication_typ";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "Enumeration of medication types (oral / IV / topical / etc.). Values populated as a follow-on import from MedCare-rs.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:combo_medication_typ";
dcterms:creator "claude-ogit-bootstrap";
diff --git a/NTO/Healthcare/enumerations/combo_spez.ttl b/NTO/Healthcare/entities/combo_spez.ttl
similarity index 93%
rename from NTO/Healthcare/enumerations/combo_spez.ttl
rename to NTO/Healthcare/entities/combo_spez.ttl
index 9880edf7d3a..949f351a880 100644
--- a/NTO/Healthcare/enumerations/combo_spez.ttl
+++ b/NTO/Healthcare/entities/combo_spez.ttl
@@ -7,8 +7,9 @@
ogit.Healthcare:combo_spez
a rdfs:Class;
- rdfs:subClassOf ogit:Enumeration;
+ rdfs:subClassOf ogit:Entity;
rdfs:label "combo_spez";
+ dcterms:valid "start=2026-10-10;";
dcterms:description "Enumeration of medical specialties / Fachrichtungen used to scope diagnoses, therapies and patient profiles. Values populated as a follow-on import from MedCare-rs.";
dcterms:source "AdaWorldAPI/MedCare-rs/.MYSQL/Struktur.sql:combo_spez";
dcterms:creator "claude-ogit-bootstrap";
diff --git a/NTO/Healthcare/verbs/assesses.ttl b/NTO/Healthcare/verbs/assesses.ttl
new file mode 100644
index 00000000000..69de74fb050
--- /dev/null
+++ b/NTO/Healthcare/verbs/assesses.ttl
@@ -0,0 +1,14 @@
+@prefix ogit: .
+@prefix ogit.Healthcare: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.Healthcare:assesses
+ a owl:ObjectProperty;
+ rdfs:subPropertyOf ogit:Verb;
+ rdfs:label "assesses";
+ dcterms:description "An assessment evaluates an anatomical structure and produces findings about it.";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/PTF/entities/Dummy.ttl b/NTO/PTF/entities/Dummy.ttl
index 18d6e69c8b8..1bf670a30ea 100644
--- a/NTO/PTF/entities/Dummy.ttl
+++ b/NTO/PTF/entities/Dummy.ttl
@@ -1,5 +1,7 @@
@prefix ogit.PTF: .
@prefix ogit: .
+@prefix rdfs: .
+@prefix dcterms: .
ogit.PTF:Dummy
a rdfs:Class;
diff --git a/NTO/PTF/entities/HiroTopology.ttl b/NTO/PTF/entities/HiroTopology.ttl
index 40c291ad8bd..b914e241f25 100644
--- a/NTO/PTF/entities/HiroTopology.ttl
+++ b/NTO/PTF/entities/HiroTopology.ttl
@@ -1,5 +1,7 @@
@prefix ogit.PTF: .
@prefix ogit: .
+@prefix rdfs: .
+@prefix dcterms: .
ogit.PTF:HiroTopology
a rdfs:Class;
diff --git a/NTO/PTF/entities/Test.ttl b/NTO/PTF/entities/Test.ttl
index 84a1ab084ab..41eb47e66cd 100644
--- a/NTO/PTF/entities/Test.ttl
+++ b/NTO/PTF/entities/Test.ttl
@@ -1,4 +1,6 @@
@prefix ogit: .
+@prefix rdfs: .
+@prefix dcterms: .
@prefix ogit.MARS: .
@prefix ogit.PTF: .
diff --git a/NTO/WorkOrder/attributes/abfahrt.ttl b/NTO/WorkOrder/attributes/abfahrt.ttl
new file mode 100644
index 00000000000..82486c4087f
--- /dev/null
+++ b/NTO/WorkOrder/attributes/abfahrt.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:abfahrt
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "abfahrt";
+ dcterms:description "Departure time as HH:MM string (max 5 chars).";
+ dcterms:source "AdaWorldAPI/WoA/models.py:LogbookEntry.abfahrt";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/abgerechnet.ttl b/NTO/WorkOrder/attributes/abgerechnet.ttl
new file mode 100644
index 00000000000..eb23bfd4db3
--- /dev/null
+++ b/NTO/WorkOrder/attributes/abgerechnet.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:abgerechnet
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "abgerechnet";
+ dcterms:description "Boolean billed-flag. True once the time entry has been transferred onto an invoice document, preventing double-billing.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:TimeSheet.abgerechnet";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/adresszusatz.ttl b/NTO/WorkOrder/attributes/adresszusatz.ttl
new file mode 100644
index 00000000000..20d9c3ff24c
--- /dev/null
+++ b/NTO/WorkOrder/attributes/adresszusatz.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:adresszusatz
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "adresszusatz";
+ dcterms:description "Address line 2 (Adresszusatz). Optional second address line for c/o, building, suite, etc.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer.adresszusatz";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/aktion.ttl b/NTO/WorkOrder/attributes/aktion.ttl
new file mode 100644
index 00000000000..946d0713382
--- /dev/null
+++ b/NTO/WorkOrder/attributes/aktion.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:aktion
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "aktion";
+ dcterms:description "Action label (Aktion) of a history entry, naming what happened to the work order. Up to 255 characters.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:HistoryEntry.aktion";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/aktiv.ttl b/NTO/WorkOrder/attributes/aktiv.ttl
new file mode 100644
index 00000000000..aabf96efc5c
--- /dev/null
+++ b/NTO/WorkOrder/attributes/aktiv.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:aktiv
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "aktiv";
+ dcterms:description "Active flag (aktiv). Boolean; false archives or soft-disables the record instead of deleting it. Used by Article, Customer and Tenant.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Article.aktiv", "AdaWorldAPI/WoA/models.py:Customer.aktiv", "AdaWorldAPI/WoA/models.py:Tenant.aktiv";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/anKunde.ttl b/NTO/WorkOrder/attributes/anKunde.ttl
new file mode 100644
index 00000000000..cf27382d445
--- /dev/null
+++ b/NTO/WorkOrder/attributes/anKunde.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:anKunde
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "anKunde";
+ dcterms:description "Customer flag (an_kunde). Boolean, default false; true includes the picture when pictures are collected for the customer.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Picture.an_kunde";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/anfahrten.ttl b/NTO/WorkOrder/attributes/anfahrten.ttl
new file mode 100644
index 00000000000..e0a91890716
--- /dev/null
+++ b/NTO/WorkOrder/attributes/anfahrten.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:anfahrten
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "anfahrten";
+ dcterms:description "Number of approach trips (Anfahrten) charged to the Order. Integer count used by the trip-cost derivation against Customer.fahrtKm / fahrtKosten.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.anfahrten";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/ankunft.ttl b/NTO/WorkOrder/attributes/ankunft.ttl
new file mode 100644
index 00000000000..5451f45e42c
--- /dev/null
+++ b/NTO/WorkOrder/attributes/ankunft.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:ankunft
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "ankunft";
+ dcterms:description "Arrival time at destination as HH:MM string (max 5 chars).";
+ dcterms:source "AdaWorldAPI/WoA/models.py:LogbookEntry.ankunft";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/anrede.ttl b/NTO/WorkOrder/attributes/anrede.ttl
new file mode 100644
index 00000000000..30e98873508
--- /dev/null
+++ b/NTO/WorkOrder/attributes/anrede.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:anrede
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "anrede";
+ dcterms:description "Form of address (Anrede). One of: Herr, Frau, Firma. Drives salutation rendering on the document.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer.anrede";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/artikelnr.ttl b/NTO/WorkOrder/attributes/artikelnr.ttl
new file mode 100644
index 00000000000..e990480dd82
--- /dev/null
+++ b/NTO/WorkOrder/attributes/artikelnr.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:artikelnr
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "artikelnr";
+ dcterms:description "Article number (Artikelnummer). Tenant-local short code used on invoices, lookup forms and inventory listings.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Article.artikelnr";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/benutzername.ttl b/NTO/WorkOrder/attributes/benutzername.ttl
new file mode 100644
index 00000000000..6b14f184123
--- /dev/null
+++ b/NTO/WorkOrder/attributes/benutzername.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:benutzername
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "benutzername";
+ dcterms:description "Plaintext account-username for the resource (max 200 chars). NOT encrypted — only the password and notes carry sensitive material.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:PasswordEntry.benutzername";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/beschreibung.ttl b/NTO/WorkOrder/attributes/beschreibung.ttl
new file mode 100644
index 00000000000..0dc674fe19a
--- /dev/null
+++ b/NTO/WorkOrder/attributes/beschreibung.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:beschreibung
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "beschreibung";
+ dcterms:description "Free-text description (Beschreibung): the article text printed on order positions, or the work performed in a time entry.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Article.beschreibung", "AdaWorldAPI/WoA/models.py:TimeSheet.beschreibung";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/betreff.ttl b/NTO/WorkOrder/attributes/betreff.ttl
new file mode 100644
index 00000000000..f28e1d9258a
--- /dev/null
+++ b/NTO/WorkOrder/attributes/betreff.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:betreff
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "betreff";
+ dcterms:description "Subject / heading line (Betreff) printed at the top of the document.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.betreff";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/bezahlt.ttl b/NTO/WorkOrder/attributes/bezahlt.ttl
new file mode 100644
index 00000000000..f644446d1dd
--- /dev/null
+++ b/NTO/WorkOrder/attributes/bezahlt.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:bezahlt
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "bezahlt";
+ dcterms:description "Payment-received flag. Boolean; true once the order has been settled by the customer.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.bezahlt";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/bezahltAm.ttl b/NTO/WorkOrder/attributes/bezahltAm.ttl
new file mode 100644
index 00000000000..d2b8f4f3c79
--- /dev/null
+++ b/NTO/WorkOrder/attributes/bezahltAm.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:bezahltAm
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "bezahltAm";
+ dcterms:description "Payment date (bezahlt am). ISO-8601 date set when the bezahlt flag is flipped from false to true. Drives the close-of-books reconciliation.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.bezahlt_am";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/bruttoSumme.ttl b/NTO/WorkOrder/attributes/bruttoSumme.ttl
new file mode 100644
index 00000000000..4093ccdcedd
--- /dev/null
+++ b/NTO/WorkOrder/attributes/bruttoSumme.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:bruttoSumme
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "bruttoSumme";
+ dcterms:description "Gross total (Brutto-Summe) = nettoSumme + mwstBetrag.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.brutto_summe";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/createdAt.ttl b/NTO/WorkOrder/attributes/createdAt.ttl
new file mode 100644
index 00000000000..ae971870419
--- /dev/null
+++ b/NTO/WorkOrder/attributes/createdAt.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:createdAt
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "createdAt";
+ dcterms:description "ISO-8601 UTC timestamp recording when the record was first persisted.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer.created_at", "AdaWorldAPI/WoA/models.py:WorkOrder.created_at", "AdaWorldAPI/WoA/models.py";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/current.ttl b/NTO/WorkOrder/attributes/current.ttl
new file mode 100644
index 00000000000..2e618d0810e
--- /dev/null
+++ b/NTO/WorkOrder/attributes/current.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:current
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "current";
+ dcterms:description "Monotonically increasing integer holding the most-recently-issued counter value. Incremented in-place by next_val() inside a database transaction.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:NumberSequence.current";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/dateiname.ttl b/NTO/WorkOrder/attributes/dateiname.ttl
new file mode 100644
index 00000000000..28cc1d6c710
--- /dev/null
+++ b/NTO/WorkOrder/attributes/dateiname.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:dateiname
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "dateiname";
+ dcterms:description "Stored file name (Dateiname) of a picture on disk.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Picture.dateiname";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/datum.ttl b/NTO/WorkOrder/attributes/datum.ttl
new file mode 100644
index 00000000000..3964450e08b
--- /dev/null
+++ b/NTO/WorkOrder/attributes/datum.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:datum
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "datum";
+ dcterms:description "ISO-8601 calendar date of the record (Datum): the document date of an order, or the date of a logbook trip.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:LogbookEntry.datum", "AdaWorldAPI/WoA/models.py:WorkOrder.datum";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/details.ttl b/NTO/WorkOrder/attributes/details.ttl
new file mode 100644
index 00000000000..e1a55cb4753
--- /dev/null
+++ b/NTO/WorkOrder/attributes/details.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:details
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "details";
+ dcterms:description "Free-text details of a history entry.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:HistoryEntry.details";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/docType.ttl b/NTO/WorkOrder/attributes/docType.ttl
new file mode 100644
index 00000000000..8349dc88511
--- /dev/null
+++ b/NTO/WorkOrder/attributes/docType.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:docType
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "docType";
+ dcterms:description "Discriminator for the document variant. One of: workorder, offer, order, invoice, credit. Mirrors WorkOrder.doc_type in the source.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.doc_type";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/einheit.ttl b/NTO/WorkOrder/attributes/einheit.ttl
new file mode 100644
index 00000000000..46814355278
--- /dev/null
+++ b/NTO/WorkOrder/attributes/einheit.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:einheit
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "einheit";
+ dcterms:description "Unit (Einheit) of a line item's quantity, such as Stk. Default Stk.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Position.einheit";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/einzelpreis.ttl b/NTO/WorkOrder/attributes/einzelpreis.ttl
new file mode 100644
index 00000000000..74bfaa127e0
--- /dev/null
+++ b/NTO/WorkOrder/attributes/einzelpreis.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:einzelpreis
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "einzelpreis";
+ dcterms:description "Net unit price (Einzelpreis) of a line item, a decimal with two places. Default 0.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Position.einzelpreis";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/ekPreis.ttl b/NTO/WorkOrder/attributes/ekPreis.ttl
new file mode 100644
index 00000000000..82218aa919c
--- /dev/null
+++ b/NTO/WorkOrder/attributes/ekPreis.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:ekPreis
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "ekPreis";
+ dcterms:description "Purchase price (Einkaufspreis) used for margin calculation against preisNetto.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Article.ek_preis";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/email.ttl b/NTO/WorkOrder/attributes/email.ttl
new file mode 100644
index 00000000000..fb93715195c
--- /dev/null
+++ b/NTO/WorkOrder/attributes/email.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:email
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "email";
+ dcterms:description "User's primary email address (max 200 chars). Used for notifications and password resets.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:User.email";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/endeKm.ttl b/NTO/WorkOrder/attributes/endeKm.ttl
new file mode 100644
index 00000000000..4694ad19d31
--- /dev/null
+++ b/NTO/WorkOrder/attributes/endeKm.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:endeKm
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "endeKm";
+ dcterms:description "Odometer reading at trip end (kilometers, float). The trip's total distance is end_km - start_km.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:LogbookEntry.ende_km";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/fahrtKm.ttl b/NTO/WorkOrder/attributes/fahrtKm.ttl
new file mode 100644
index 00000000000..7f4bcbb5df1
--- /dev/null
+++ b/NTO/WorkOrder/attributes/fahrtKm.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:fahrtKm
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fahrtKm";
+ dcterms:description "One-way travel distance in kilometres (Fahrt km). Multiplied by Order.anfahrten and fahrtKosten to compute the trip-cost line item.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer.fahrt_km";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/fahrtKosten.ttl b/NTO/WorkOrder/attributes/fahrtKosten.ttl
new file mode 100644
index 00000000000..4b9ca586154
--- /dev/null
+++ b/NTO/WorkOrder/attributes/fahrtKosten.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:fahrtKosten
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fahrtKosten";
+ dcterms:description "Per-kilometre travel cost in the tenant's currency (Fahrt Kosten). Float; default 0.0. Used together with fahrtKm and Order.anfahrten to compute trip-cost line items.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer.fahrt_kosten";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/fahrzeug.ttl b/NTO/WorkOrder/attributes/fahrzeug.ttl
new file mode 100644
index 00000000000..6ce7d7b9361
--- /dev/null
+++ b/NTO/WorkOrder/attributes/fahrzeug.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:fahrzeug
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "fahrzeug";
+ dcterms:description "Vehicle identifier (license plate or fleet name, max 100 chars).";
+ dcterms:source "AdaWorldAPI/WoA/models.py:LogbookEntry.fahrzeug";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/firma.ttl b/NTO/WorkOrder/attributes/firma.ttl
new file mode 100644
index 00000000000..678a2063331
--- /dev/null
+++ b/NTO/WorkOrder/attributes/firma.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:firma
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "firma";
+ dcterms:description "Company name (Firma). Empty for private customers; in that case display falls back to vorname + nachname.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer.firma";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/firstname.ttl b/NTO/WorkOrder/attributes/firstname.ttl
new file mode 100644
index 00000000000..4eb618fda77
--- /dev/null
+++ b/NTO/WorkOrder/attributes/firstname.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:firstname
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "firstname";
+ dcterms:description "User's given name (max 120 chars).";
+ dcterms:source "AdaWorldAPI/WoA/models.py:User.firstname";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/geraet.ttl b/NTO/WorkOrder/attributes/geraet.ttl
new file mode 100644
index 00000000000..42e15f6da12
--- /dev/null
+++ b/NTO/WorkOrder/attributes/geraet.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:geraet
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "geraet";
+ dcterms:description "Device or asset (Geraet) the activity was performed on. Free text, up to 150 characters.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Activity.geraet";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/gruppe.ttl b/NTO/WorkOrder/attributes/gruppe.ttl
new file mode 100644
index 00000000000..e1fb4a7da99
--- /dev/null
+++ b/NTO/WorkOrder/attributes/gruppe.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:gruppe
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "gruppe";
+ dcterms:description "Vault folder/category (max 100 chars, default 'Allgemein'). Free-form grouping used to organise entries in the UI tree.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:PasswordEntry.gruppe";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/iban.ttl b/NTO/WorkOrder/attributes/iban.ttl
new file mode 100644
index 00000000000..34a3558f603
--- /dev/null
+++ b/NTO/WorkOrder/attributes/iban.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:iban
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "iban";
+ dcterms:description "International Bank Account Number for SEPA payments. Optional; not modelled as a column in the current Python source but reserved here for the OGIT projection.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/icon.ttl b/NTO/WorkOrder/attributes/icon.ttl
new file mode 100644
index 00000000000..f5311241b39
--- /dev/null
+++ b/NTO/WorkOrder/attributes/icon.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:icon
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "icon";
+ dcterms:description "Icon glyph name (max 50 chars, default 'key') used by the UI to render the entry visually.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:PasswordEntry.icon";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/intern.ttl b/NTO/WorkOrder/attributes/intern.ttl
new file mode 100644
index 00000000000..6d680bec30e
--- /dev/null
+++ b/NTO/WorkOrder/attributes/intern.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:intern
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "intern";
+ dcterms:description "Internal flag (intern). Boolean, default false; true hides the activity from the customer portal's logbook.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Activity.intern";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/internNotizen.ttl b/NTO/WorkOrder/attributes/internNotizen.ttl
new file mode 100644
index 00000000000..6ac155b030f
--- /dev/null
+++ b/NTO/WorkOrder/attributes/internNotizen.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:internNotizen
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "internNotizen";
+ dcterms:description "Internal notes (interne Notizen). Free-text block visible only to staff; never printed on the customer-facing document.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.intern_notizen";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/isAdmin.ttl b/NTO/WorkOrder/attributes/isAdmin.ttl
new file mode 100644
index 00000000000..f734b5192b1
--- /dev/null
+++ b/NTO/WorkOrder/attributes/isAdmin.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:isAdmin
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "isAdmin";
+ dcterms:description "Boolean flag granting admin-level access within the User's tenant scope (manage customers, articles, settings).";
+ dcterms:source "AdaWorldAPI/WoA/models.py:User.is_admin";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/isSuperadmin.ttl b/NTO/WorkOrder/attributes/isSuperadmin.ttl
new file mode 100644
index 00000000000..abc63d1396e
--- /dev/null
+++ b/NTO/WorkOrder/attributes/isSuperadmin.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:isSuperadmin
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "isSuperadmin";
+ dcterms:description "Boolean flag granting cross-tenant superadmin access (manage tenants, system-wide configuration).";
+ dcterms:source "AdaWorldAPI/WoA/models.py:User.is_superadmin";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/kdnr.ttl b/NTO/WorkOrder/attributes/kdnr.ttl
new file mode 100644
index 00000000000..5c95de120b7
--- /dev/null
+++ b/NTO/WorkOrder/attributes/kdnr.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:kdnr
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "kdnr";
+ dcterms:description "Customer number (Kundennummer). Tenant-local short code used on invoices and in correspondence.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer.kdnr";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/label.ttl b/NTO/WorkOrder/attributes/label.ttl
new file mode 100644
index 00000000000..298f4fe0936
--- /dev/null
+++ b/NTO/WorkOrder/attributes/label.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:label
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "label";
+ dcterms:description "Human-readable caption (max 200 chars) shown next to the key in admin UIs.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Setting.label";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/lastLogin.ttl b/NTO/WorkOrder/attributes/lastLogin.ttl
new file mode 100644
index 00000000000..21e9daf5244
--- /dev/null
+++ b/NTO/WorkOrder/attributes/lastLogin.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:lastLogin
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "lastLogin";
+ dcterms:description "ISO-8601 UTC timestamp of the most recent successful portal login. Null on accounts that have never signed in.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:CustomerPortalUser.last_login";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/lastname.ttl b/NTO/WorkOrder/attributes/lastname.ttl
new file mode 100644
index 00000000000..6f906ffbaa9
--- /dev/null
+++ b/NTO/WorkOrder/attributes/lastname.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:lastname
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "lastname";
+ dcterms:description "User's family name (max 120 chars).";
+ dcterms:source "AdaWorldAPI/WoA/models.py:User.lastname";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/letzteMahnung.ttl b/NTO/WorkOrder/attributes/letzteMahnung.ttl
new file mode 100644
index 00000000000..b955cba49bb
--- /dev/null
+++ b/NTO/WorkOrder/attributes/letzteMahnung.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:letzteMahnung
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "letzteMahnung";
+ dcterms:description "Date of the most recent dunning notice (letzte Mahnung). ISO-8601 date, advanced when mahnstufe is incremented.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.letzte_mahnung";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/lieferant.ttl b/NTO/WorkOrder/attributes/lieferant.ttl
new file mode 100644
index 00000000000..ce6a58dbc8a
--- /dev/null
+++ b/NTO/WorkOrder/attributes/lieferant.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:lieferant
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "lieferant";
+ dcterms:description "Supplier name (Lieferant) the article is normally sourced from. Free-form string; not a relation to a separate Supplier class in the current source.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Article.lieferant";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/lieferantAnr.ttl b/NTO/WorkOrder/attributes/lieferantAnr.ttl
new file mode 100644
index 00000000000..a0f0a87fc8d
--- /dev/null
+++ b/NTO/WorkOrder/attributes/lieferantAnr.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:lieferantAnr
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "lieferantAnr";
+ dcterms:description "Supplier-side article number (Lieferanten-Artikelnummer). Used when reordering: the artikelnr is the tenant-local code, lieferantAnr is the SKU at the supplier.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Article.lieferant_anr";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/logbuch.ttl b/NTO/WorkOrder/attributes/logbuch.ttl
new file mode 100644
index 00000000000..2b7c77339c8
--- /dev/null
+++ b/NTO/WorkOrder/attributes/logbuch.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:logbuch
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "logbuch";
+ dcterms:description "Logbook flag (Logbuch). Boolean, default false; true lists the activity or picture in the customer's logbook, both on the customer page and in the customer portal.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Activity.logbuch", "AdaWorldAPI/WoA/models.py:Picture.logbuch";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/logoPath.ttl b/NTO/WorkOrder/attributes/logoPath.ttl
new file mode 100644
index 00000000000..af8c724b738
--- /dev/null
+++ b/NTO/WorkOrder/attributes/logoPath.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:logoPath
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "logoPath";
+ dcterms:description "Filesystem or URL path to the tenant's logo image used in PDF/HTML rendering of work orders.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Tenant.logo_path";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/mahnstufe.ttl b/NTO/WorkOrder/attributes/mahnstufe.ttl
new file mode 100644
index 00000000000..fc5e3f7c560
--- /dev/null
+++ b/NTO/WorkOrder/attributes/mahnstufe.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:mahnstufe
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "mahnstufe";
+ dcterms:description "Dunning level (Mahnstufe). Integer 0-3: 0 = nothing sent, 1-3 = three escalation tiers per the Mahnwesen workflow.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.mahnstufe";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/mailAnrede.ttl b/NTO/WorkOrder/attributes/mailAnrede.ttl
new file mode 100644
index 00000000000..65443dc76b5
--- /dev/null
+++ b/NTO/WorkOrder/attributes/mailAnrede.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:mailAnrede
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "mailAnrede";
+ dcterms:description "Email salutation override (mail_anrede). Free-text override for the opening line of automated mails (e.g. 'Sehr geehrte Frau Mueller'). When empty, derived from anrede + nachname.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Customer.mail_anrede";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/menge.ttl b/NTO/WorkOrder/attributes/menge.ttl
new file mode 100644
index 00000000000..e99a9fd794c
--- /dev/null
+++ b/NTO/WorkOrder/attributes/menge.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:menge
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "menge";
+ dcterms:description "Quantity (Menge) of a line item. Default 1.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:Position.menge";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/minuten.ttl b/NTO/WorkOrder/attributes/minuten.ttl
new file mode 100644
index 00000000000..d0c6d11df15
--- /dev/null
+++ b/NTO/WorkOrder/attributes/minuten.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:minuten
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "minuten";
+ dcterms:description "Duration of the recorded work in minutes (integer). Display helpers round up to the nearest 15-minute increment for billing.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:TimeSheet.minuten";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/mitarbeiter.ttl b/NTO/WorkOrder/attributes/mitarbeiter.ttl
new file mode 100644
index 00000000000..a970084b6dd
--- /dev/null
+++ b/NTO/WorkOrder/attributes/mitarbeiter.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:mitarbeiter
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "mitarbeiter";
+ dcterms:description "Crew on site (Mitarbeiter). Free-form short label or comma-separated names; the Python source keeps it as a string column rather than a User-relation join because crew composition is often informal.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.mitarbeiter";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/mustChangePw.ttl b/NTO/WorkOrder/attributes/mustChangePw.ttl
new file mode 100644
index 00000000000..30aa873e865
--- /dev/null
+++ b/NTO/WorkOrder/attributes/mustChangePw.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:mustChangePw
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "mustChangePw";
+ dcterms:description "Boolean forced-password-change marker. When true, the next successful login redirects the user to the password-reset flow.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:User.must_change_pw";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/mwstBetrag.ttl b/NTO/WorkOrder/attributes/mwstBetrag.ttl
new file mode 100644
index 00000000000..80e4982191e
--- /dev/null
+++ b/NTO/WorkOrder/attributes/mwstBetrag.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: .
+@prefix dcterms: .
+
+ogit.WorkOrder:mwstBetrag
+ a owl:DatatypeProperty;
+ rdfs:subPropertyOf ogit:Attribute;
+ rdfs:label "mwstBetrag";
+ dcterms:description "VAT amount (MwSt-Betrag). Derived in Python as sum(menge × einzelpreis × mwst_satz / 100) over all positions.";
+ dcterms:source "AdaWorldAPI/WoA/models.py:WorkOrder.mwst_betrag";
+ dcterms:valid "start=2026-10-10;";
+ dcterms:creator "claude-ogit-bootstrap";
+.
diff --git a/NTO/WorkOrder/attributes/mwstSatz.ttl b/NTO/WorkOrder/attributes/mwstSatz.ttl
new file mode 100644
index 00000000000..1542496e777
--- /dev/null
+++ b/NTO/WorkOrder/attributes/mwstSatz.ttl
@@ -0,0 +1,15 @@
+@prefix ogit.WorkOrder: .
+@prefix ogit: .
+@prefix owl: .
+@prefix rdfs: