Study is the central organizing entity of the clinical-trials reference graph. Every other top-level relates to Study somehow: Sponsor.runs (1..1) reaches into it, StudySite.forStudy (1..1) anchors off it, Visit-template and Visit-occurrence (when Visit lifts) sit beneath it, Participant participation flows through it. Study itself owns the design-side chain: Protocol, Arms, Schedule of Assessments, Endpoints, Inclusion/Exclusion Criteria — all as sub-objects whose lifecycle is bound to the Study. USDM v3 nests this as Study → StudyVersion → StudyDesign → arms/endpoints/criteria/scheduleTimelines; TOP flattens this nesting for operator UX, with a single studyVersion attribute carrying simple-version cases. The flattening preserves clean projection back to USDM via a future StudyVersion sub-object lift if richer multi-version semantics become operationally needed.
What you see if you query the model: a Study entity with 36 attributes (identity, names, type/phase/design parameters, population/eligibility framing, lifecycle/dates, multi-registry IDs, tags), 16 relationships pointing at sub-objects (Protocol, Arm, ScheduleOfAssessments, Endpoint, InclusionCriterion, ExclusionCriterion) and at flagged-missing horizontals that lift on their own tracks (Amendment, Milestone, InvestigationalProduct, OversightBody, StudyStartupPackage, RiskAssessment, Tag), and 6 sub-objects under sub_objects. Study has no direct edges to Site (those are reached through StudySite.forStudy inverse), no direct edges to Participants (reached through StudySite.hasParticipant), no direct edges to Visit-occurrences (reached through StudySite.hostsVisit). The direct-vs-traversed discipline established in the Site spec applies in mirror image at the Study side: Study keeps direct edges only to study-design entities; operational data is reached through StudySite, Participant, and Visit-occurrence.
Six new SHACL invariants encode the lifecycle truths that are operator-grounded: a Study at or past RECRUITING must have endpoints, inclusion criteria, and an SOA defined; an INTERVENTIONAL Study must have a phase; multi-arm interventionModel values (PARALLEL, CROSSOVER, FACTORIAL, SEQUENTIAL) require multiple Arm sub-objects. These catch the "spec-shaped but operationally meaningless" cases where a study claims to be recruiting without having defined what it's measuring or who is eligible.
Study is the pivot. The definition-side chain (Protocol → SOA → Visit-template → Activity) hangs off Study via sub-objects and traversed relationships; the operational-side chain (Site → StudySite → Study, then StudySite → Participant / Visit-occurrence / etc.) reaches into Study through the StudySite.forStudy inverse and the Sponsor.runs inverse. From Study's own outgoing edges, we never see Sites or Participants directly — those are inverse traversals.
This anchors three model decisions that mirror the Site spec's discipline:
| Attribute | Type | Doc |
|---|---|---|
| studyId | ngsi-ld:URI | Globally unique NGSI-LD identifier. |
| sponsorProtocolId | xsd:string | Sponsor's internal protocol identifier (e.g., 'ONCO-423-001'). |
| studyTitle, studyShortTitle, studyAcronym | xsd:string | Display names. |
| studyType | enum | INTERVENTIONAL · OBSERVATIONAL · EXPANDED_ACCESS · PATIENT_REGISTRY |
| studyPhase | enum | PHASE_0 · PHASE_1 · PHASE_1_2 · PHASE_2 · PHASE_2_3 · PHASE_3 · PHASE_4 · NOT_APPLICABLE. Required when studyType=INTERVENTIONAL (SHACL invariant 14). |
| interventionModel | enum | SINGLE_GROUP · PARALLEL · CROSSOVER · FACTORIAL · SEQUENTIAL. SHACL invariant 16: multi-arm models (PARALLEL, CROSSOVER, FACTORIAL, SEQUENTIAL) require multiple Arm sub-objects. |
| allocation | enum | RANDOMIZED · NON_RANDOMIZED · NOT_APPLICABLE |
| masking | enum | OPEN_LABEL · SINGLE_BLIND · DOUBLE_BLIND · TRIPLE_BLIND · QUADRUPLE_BLIND |
| primaryPurpose | enum | TREATMENT · PREVENTION · DIAGNOSTIC · SUPPORTIVE_CARE · SCREENING · HEALTH_SERVICES_RESEARCH · BASIC_SCIENCE · DEVICE_FEASIBILITY · OTHER |
| studyStatus | enum | PLANNED · RECRUITING · ENROLLING_BY_INVITATION · ACTIVE_NOT_RECRUITING · COMPLETED · SUSPENDED · TERMINATED · WITHDRAWN · UNKNOWN_STATUS. Distinct from per-StudySite status. SHACL invariants 11–13: at-or-past-RECRUITING requires endpoints / inclusion / SOA. |
| conditionStudied, therapeuticArea | xsd:string | Disease / TA classification. |
| targetEnrollment, actualEnrollment | xsd:integer | Aggregate across all sites; per-StudySite values live on StudySite. |
| enrollmentType | enum | ANTICIPATED · ACTUAL. |
| minAge, maxAge, sexEligibility, acceptsHealthyVolunteers | mixed | Population eligibility framing. |
| plannedStartDate, actualStartDate, primaryCompletionDate, plannedCompletionDate, actualCompletionDate | xsd:date | Lifecycle dates. |
| responsibleParty | enum | SPONSOR · INVESTIGATOR_SPONSOR · SPONSOR_INVESTIGATOR · OTHER. INVESTIGATOR_SPONSOR for IITs. |
| studyVersion | xsd:string | Current version (e.g., '3.2.1'). Mirrors USDM StudyVersion.versionIdentifier. |
| clinicalTrialsGovId, eudraCT, euCtisId, isrctn, nciId, otherRegistryIds | xsd:string | Registry identifiers. |
| Predicate | Target | Cardinality | Operational meaning |
|---|---|---|---|
| hasProtocol | Protocol | 1..1 | Current effective Protocol (sub-object). |
| hasArm | Arm | 1..N | Study arms (sub-object). 1..N because every study has at least one arm (single-arm studies count). |
| hasSchedule | ScheduleOfAssessments | 0..N | SOA(s) (sub-object). 0..N during PLANNED; required at-or-past-RECRUITING (SHACL invariant 13). |
| hasEndpoint | Endpoint | 0..N | Endpoints (sub-object). 0..N during PLANNED; required at-or-past-RECRUITING (SHACL invariant 11). |
| hasInclusionCriterion | InclusionCriterion | 0..N | Inclusion criteria (sub-object). 0..N during PLANNED; required at-or-past-RECRUITING (SHACL invariant 12). |
| hasExclusionCriterion | ExclusionCriterion | 0..N | Exclusion criteria (sub-object). Always 0..N (rare studies have no exclusion criteria). |
| hasAmendment | Amendment | 0..N | Protocol amendments. Flagged-missing. |
| hasMilestone | Milestone | 0..N | FPI / LPI / DBL / CSR. Flagged-missing. |
| suppliesInvestigationalProduct | InvestigationalProduct | 0..N | IPs supplied for this Study. Flagged-missing (IP is an OOUX top-level). |
| hasOversightBody | OversightBody | 0..N | Study-level DSMB / IDMC. Flagged-missing. |
| hasStudyStartupPackage | StudyStartupPackage | 0..1 | Flagged-missing. |
| usesSystem | System | 0..N | Per-Study Systems (the EDC, CTMS, IRT, eTMF, safety database used for this Study). |
| hasStatisticalAnalysisPlan | Document | 0..1 | The SAP document. |
| hasStudyTeam | Person | 0..N | Study team (PM, Biostats, Medical Monitor, PV Lead). Orthogonal to per-StudySite delegation. |
| hasTag | Tag | 0..N | User-defined tags. Flagged-missing. |
| hasRiskAssessment | RiskAssessment | 0..N | ICH E8(R1) quality-by-design risk assessments. Flagged-missing. |
| Sub-object | Attrs | Doc |
|---|---|---|
| Protocol | 10 | The canonical study-design document. protocolId, protocolNumber, protocolTitle, protocolVersion, protocolStatus (DRAFT / IN_REVIEW / APPROVED / EFFECTIVE / AMENDED / SUPERSEDED / RETIRED), approvalDate, effectiveDate, protocolDocumentRef, ddfDocumentRef (USDM Digital Definition Format), studyDesignRationale. |
| Arm | 9 | Study arm (treatment group, comparator, observational cohort). armId, armName, armShortName, armType (EXPERIMENTAL / ACTIVE_COMPARATOR / PLACEBO_COMPARATOR / NO_INTERVENTION / SHAM_COMPARATOR / OTHER), armDescription, armSize, interventionDescription, isPlaceboArm, isControlArm. |
| ScheduleOfAssessments | 8 | The visit-by-procedure matrix. soaId, soaName, soaVersion, soaStatus (DRAFT / APPROVED / EFFECTIVE / SUPERSEDED), approvalDate, effectiveDate, soaDocumentRef, description. |
| Endpoint | 8 | Study endpoint. endpointId, endpointName, endpointDescription, endpointType (PRIMARY / SECONDARY / EXPLORATORY / SAFETY), endpointMeasurementType (BINARY / CONTINUOUS / ORDINAL / TIME_TO_EVENT / COUNT / RATE / OTHER), measurementUnit, timeFrame, statisticalApproach. |
| InclusionCriterion | 6 | Eligibility inclusion criterion. criterionId, criterionNumber, criterionText, criterionCategory (AGE / SEX / DIAGNOSIS / DISEASE_STAGE / LAB_VALUES / MEDICAL_HISTORY / PRIOR_TREATMENT / MEDICATIONS / PERFORMANCE_STATUS / GENETIC / OTHER), waiverAllowed, waiverConditions. |
| ExclusionCriterion | 6 | Eligibility exclusion criterion. Same shape as InclusionCriterion but adds PREGNANCY to the criterionCategory enum (near-universal exclusion in interventional studies). |
USDM v3 carries the actual study content three levels deep: Study is a thin container with versions; StudyVersion holds versioned identifiers, organizations, amendments, and study designs; StudyDesign holds arms, endpoints, criteria, schedule timelines, objectives. TOP flattens this nesting: a single Study entity carries the design content directly via sub-objects. The studyVersion attribute on Study captures simple version identification (e.g., "3.2.1"); richer multi-version semantics (versioned design, multi-version diff queries) lift to a future StudyVersion sub-object in v0.4 if operationally needed.
Trade-off: TOP loses USDM's clean separation of "the trial concept" (Study) from "this version of the trial's definition" (StudyVersion). For operator UX this is an acceptable simplification — operators speak of "Study X v3.2" not "Study X version 3.2". USDM-shaped consumers re-reify the version structure at projection time.
Protocol, Arm, Schedule of Assessments, Endpoint, Inclusion Criterion, and Exclusion Criterion are all modeled as sub-objects of Study, not as horizontals. Their lifecycle is bound to the Study: an Arm exists because the Study exists; an Endpoint is meaningful only in the Study's context. Sub-object semantics make this explicit (the SHACL topc:Arm shape is anchored within Study's NodeShape; deletion of Study cascades).
This contrasts with horizontals (Document, Person, System, etc.) whose lifecycle is independent. A Person can exist without any Study; an Arm cannot. Trade-off: sub-object containment means cross-Study reference of an Arm is awkward (you'd reference Study.hasArm[i] rather than a global Arm URI) — but cross-Study Arm reference isn't a real operational pattern, so the trade-off is free.
The same discipline established in the Site spec applies in mirror image at the Study side. Study's direct edges are to study-design entities (Protocol, Arms, SOA, Endpoints, Criteria) and study-level horizontals (Amendment, Milestone, IP, OversightBody, etc.). Sites participating in this Study are reached through the StudySite.forStudy inverse; Participants enrolled at sites for this Study are reached through StudySite.hasParticipant; Visit-occurrences at sites are reached through StudySite.hostsVisit (when Visit lifts).
The benefit is the same as on Site: Study stays compact, queries are explicit traversals (which makes them auditable), and cross-cutting analytics (per-Study enrollment, per-Study queries, etc.) work the same way regardless of which top-level perspective they come from. Trade-off: operators querying "all participants on Study X" need to traverse ?ss topc:forStudy ?study; topc:hasParticipant ?p rather than a direct ?study top:hasParticipant ?p. Acceptable: named query templates abstract this for operators.
USDM models eligibility via a single EligibilityCriterion entity with a code field distinguishing inclusion from exclusion. TOP splits this into InclusionCriterion and ExclusionCriterion sub-objects. Reason: operators read inclusion and exclusion as distinct lists (the Protocol's "Inclusion Criteria" section vs "Exclusion Criteria" section), and the SFQ feasibility flow filters them separately. The split also lets ExclusionCriterion add PREGNANCY to its category enum without polluting InclusionCriterion (pregnancy is essentially never an inclusion criterion in interventional studies).
Trade-off: projection to USDM unifies the two into a single EligibilityCriterion list with type codes. Mechanical at emission time; no semantic loss.
From Study's side, "who sponsors this Study" is answered by inverse traversal: ?sponsor a top:Sponsor; top:runs ?study. No direct Study.runsBy → Sponsor relationship is added because (a) it would denormalize the Sponsor.runs cardinality which is already authoritative, and (b) the Sponsor model is per-Org-per-Study, so there can be multiple Sponsor entities for one Study (multi-jurisdictional, CRO-as-proxy, IIT financial+operational+regulatory split) — the inverse view handles this naturally.
Same pattern as Site: Site has no direct Site.engagedBy → Sponsor edge; Sponsor.engages → Site is the authoritative direction. Symmetry across top-levels.
USDM v3 is the CDISC Unified Study Definition Model — the canonical study-definition standard for trial design. TOP's Study entity projects into USDM via flattening (per Decision 1). Verified against the actual USDM v3 source (github.com/cdisc-org/usdm/src/usdm_model/):
| USDM v3 entity | USDM fields | TOP mapping |
|---|---|---|
| Study | id, name, description, label, versions[], documentedBy[], instanceType | TOP Study identity attributes (studyId, sponsorProtocolId, studyTitle, studyDescription) plus the studyVersion attribute (mirroring StudyVersion.versionIdentifier). |
| StudyVersion | versionIdentifier, rationale, dateValues, amendments, businessTherapeuticAreas, studyIdentifiers, referenceIdentifiers, studyDesigns, titles, eligibilityCriterionItems, narrativeContentItems, abbreviations, roles, organizations, studyInterventions, administrableProducts, medicalDevices, productOrganizationRoles, biomedicalConcepts, ... | Currently flattened into Study attributes + sub-objects. The studyVersion attribute carries versionIdentifier; therapeuticArea attribute carries businessTherapeuticAreas; multi-registry IDs (clinicalTrialsGovId, eudraCT, euCtisId, isrctn, nciId, otherRegistryIds) cover studyIdentifiers; titles project from studyTitle/studyShortTitle/studyAcronym; amendments project from Study.hasAmendment (when Amendment lifts); rationale projects from Protocol.studyDesignRationale; organizations (Sponsor / sites) project via Sponsor and StudySite. Future StudyVersion sub-object in v0.4 if richer multi-version semantics warrant. |
| StudyDesign | studyType, studyPhase, therapeuticAreas, characteristics, encounters, activities, arms, studyCells, rationale, epochs, elements, estimands, indications, studyInterventionIds, objectives, population, scheduleTimelines, biospecimenRetentions, eligibilityCriteria, analysisPopulations | TOP Study attributes (studyType, studyPhase, therapeuticArea) + sub-objects (Arm × hasArm, ScheduleOfAssessments × hasSchedule, Endpoint × hasEndpoint, InclusionCriterion × hasInclusionCriterion, ExclusionCriterion × hasExclusionCriterion). USDM's encounters / activities / epochs / elements / estimands lift in v0.4 when Visit and Activity top-levels lift. |
| StudyArm | (USDM Arm has armName, armType code, etc.) | TOP Arm sub-object (9 attrs). |
| Endpoint | purpose, level, instanceType (plus inherited from SyntaxTemplate) | TOP Endpoint sub-object (8 attrs). USDM's level (PRIMARY/SECONDARY/etc.) maps to TOP's endpointType. |
| EligibilityCriterion | (code distinguishes inclusion from exclusion; text content) | TOP splits into InclusionCriterion + ExclusionCriterion (per Decision 4). Mechanical re-unification at projection time. |
| ScheduleTimeline | (visit timing structure) | TOP ScheduleOfAssessments sub-object. USDM's per-instance visit timing details are a richer model that TOP-Visit will engage with when Visit lifts. |
ICH E8(R1) "General Considerations for Clinical Studies" (October 2021) is the GCP framework for study design: quality by design, identification of critical-to-quality factors, risk-based approach to design and conduct. ICH E6(R3) Step 4 Final (January 2025) extends this to the conduct framework. Together they define the regulatory shape of a "well-designed clinical study."
| Area | ICH source | How TOP's Study entity supports it |
|---|---|---|
| Quality by design / critical-to-quality factors | E8(R1) §3 | Study.hasRiskAssessment relationship (flagged-missing; lifts in v0.3+). Study.studyDesignRationale (on Protocol sub-object) carries the design rationale. |
| Study type and phase classification | E8(R1) §2; ICH E6(R3) Section 1 | studyType + studyPhase enums; SHACL invariant 14 (interventional must have phase). |
| Population definition and eligibility | E8(R1) §6.2 | Inclusion / Exclusion sub-objects with categorization; population framing attributes (minAge, maxAge, sexEligibility, acceptsHealthyVolunteers). |
| Endpoint definition | E8(R1) §6.3; E9 alignment for statistical aspects | Endpoint sub-object with endpointType (PRIMARY/SECONDARY/EXPLORATORY/SAFETY), measurement type, time frame, statistical approach. |
| Study design (interventional model, allocation, masking) | E8(R1) §6.4 | interventionModel, allocation, masking enums. |
| Schedule of assessments | E8(R1) §7; E6(R3) Section 4 data lifecycle | ScheduleOfAssessments sub-object linked from Study.hasSchedule. |
| Protocol versioning and amendments | E6(R3) Section 2.5 (protocol compliance), Section 3 (sponsor responsibilities for amendments) | Protocol.protocolVersion + protocolStatus; Study.hasAmendment relationship for amendment lineage (flagged-missing target lifts v0.3+). |
| Sponsor responsibility for study design | E6(R3) Section 3.1, 3.10 (quality management) | Sponsor.runs → Study (1..1) plus the responsibility flags on Sponsor (isSponsorOfRecord, hasRegulatoryResponsibility, etc.). |
| Data Safety Monitoring Board / IDMC | E6(R3) Section 5 oversight; E9 | Study.hasOversightBody → OversightBody (flagged-missing). |
Trials register with multiple authorities depending on jurisdiction: ClinicalTrials.gov (US), EudraCT and EU CTIS (EU), ISRCTN (UK), NCI (oncology, US), JPRN (Japan), ChiCTR (China), ANZCTR (Australia/New Zealand), ChiCTR. TOP's Study carries explicit attributes for the four most common (clinicalTrialsGovId, eudraCT, euCtisId, isrctn, nciId) plus a comma-separated otherRegistryIds for the long tail.
| Registry | TOP attribute | Notes |
|---|---|---|
| ClinicalTrials.gov (US, NIH/NLM) | clinicalTrialsGovId | NCT identifier (e.g., 'NCT99999423'). Required for US sponsors under FDAAA 801; also commonly required by journals at publication. |
| EudraCT (EU, legacy) | eudraCT | EU CTR Article 80 register identifier. Format: 'YYYY-NNNNNN-CC'. Replaced by CTIS for new submissions but maintained for legacy trials. |
| EU Clinical Trials Information System (EU, current) | euCtisId | The EU CTR's current registry identifier; replaces EudraCT for new submissions under the EU Clinical Trials Regulation. |
| ISRCTN (UK) | isrctn | International Standard Randomised Controlled Trial Number; UK-led registry, accepts global trials. |
| NCI Clinical Trials ID (US, oncology) | nciId | NCI-issued identifier for oncology-focused trials. |
| Other (JPRN, ChiCTR, ANZCTR, REBEC, …) | otherRegistryIds | Comma-separated for the long tail. v0.4 may promote individual registries to attributes if they hit critical mass in TOP-using studies. |
Registry alignment matters operationally because regulatory submissions, journal publications, and patient-facing recruitment all depend on the trial being findable by registry ID. TOP's multi-registry model lets a single Study carry every identifier it accumulates over its lifecycle.
| Transition | Trigger | SHACL guards |
|---|---|---|
| PLANNED → RECRUITING | Activation; IRB approved at ≥1 site; first site IN_QUALIFICATION → ACTIVE | Invariants 11/12/13: must have ≥1 endpoint, ≥1 inclusion criterion, ≥1 SOA. Invariant 14: if INTERVENTIONAL, must have studyPhase. |
| RECRUITING ↔ ACTIVE_NOT_RECRUITING | Enrollment closes; participants continue protocol | Same invariants as RECRUITING. |
| ACTIVE_NOT_RECRUITING → COMPLETED | Last patient last visit (LPLV); primary outcome assessed | Same invariants. Soft warning (invariant 15): COMPLETED should have actualCompletionDate populated. |
| any ACTIVE → SUSPENDED | Safety hold, IRB suspension, recruitment pause | Bidirectional: SUSPENDED can resume to RECRUITING or ACTIVE_NOT_RECRUITING. |
| any ACTIVE → TERMINATED | Early stop (DSMB recommendation, futility, sponsor decision) | One-way; TERMINATED is terminal. Distinct from COMPLETED (planned end) and WITHDRAWN (never enrolled). |
| PLANNED → WITHDRAWN | Never enrolled a patient; sponsor decided not to proceed | One-way; rare. |
Note on Study lifecycle vs StudySite lifecycle: the Study's overall studyStatus is independent of any per-site studySiteStatus. A Study can be RECRUITING globally while individual StudySites are PLANNED, IN_QUALIFICATION, ACTIVE, ON_HOLD, or CLOSED. The aggregate enrollment view sums across StudySites; the global studyStatus reflects the operational whole.
An interventional, open-label, phase 1 dose-escalation study of Drug X in patients with advanced solid tumors. Single arm (Drug X with escalating doses), three cohorts at 3 dose levels.
Pfizer's ONCO-423: phase 3 randomized double-blind placebo-controlled study of a novel oncology agent. Two arms (Drug X + standard of care vs Placebo + standard of care).
MSKCC IIT-ONCO-001: a single-PI academic study of a refractory hematologic malignancy. MSKCC plays both Sponsor and Site roles (per Site spec IIT pattern). responsibleParty=INVESTIGATOR_SPONSOR.
A global phase 3 study with FDA and EMA submissions; Pfizer Inc as US sponsor of record, Pfizer Ireland as EU sponsor of record, IQVIA as operational sponsor (per Sponsor spec multi-jurisdictional pattern).
A multi-center patient registry capturing real-world use of an approved drug in patients with rare disease X.
Two-period two-treatment crossover bioequivalence study comparing a generic drug to the reference listed drug.
Reads: the entire Study scope (status, dates, milestones, registry IDs, sites, enrollment). Per-StudySite enrollment views via traversal. Writes: studyStatus transitions, studyVersion increments, milestone achievement.
Reads: Protocol, eligibility criteria, endpoint definitions, AE traversal across all StudySites and Participants. Writes: protocol amendments, eligibility waivers, safety reporting decisions.
Reads: Endpoints (especially endpointMeasurementType, statisticalApproach), Arms, ScheduleOfAssessments, SAP document, raw data via OMOP projection of TOP-grounded participant data. Writes: SAP document, interim analysis reports.
Reads: Sponsor.regulatoryAuthorityScope, all registry IDs (clinicalTrialsGovId, eudraCT, euCtisId, isrctn, nciId), Protocol versions and amendments, RegulatorySubmission entities. Writes: submissions, registry updates.
Reads: Endpoint:safety, AE/SAE traversal across all StudySites, OversightBody (DSMB) interactions, RegulatorySubmission entries (expedited reports). Writes: safety reports, signal detection outputs.
Reads: Protocol, ScheduleOfAssessments, eligibility criteria, his own StudySite scope (his Participants, his Visits, his AEs). Writes: investigator decisions, AE assessments, eligibility verification.
Reads: All Studies sponsored by the parent Organization (via Organization.playsSponsorRole → Sponsor.runs → Study traversal). Aggregate enrollment, milestone progress, study lifecycle distribution. Writes: portfolio reports.
Reads: Public Study attributes (titles, IDs, phase, status, eligibility) via registry projections. With access, Participant-level data via OMOP CDM projection through StudySite traversal.
GET /entities?type=Study &id=urn:ngsi-ld:Study:ONCO-423 &options=keyValues # Read targetEnrollment and actualEnrollment # For per-site breakdown: GET /entities?type=StudySite &q=forStudy=="urn:ngsi-ld:Study:ONCO-423" &attrs=siteNumber,studySiteStatus,enrollmentTarget,actualEnrollment
GET /entities?type=Study &id=urn:ngsi-ld:Study:ONCO-423 &attrs=hasInclusionCriterion,hasExclusionCriterion # Then resolve each criterion GET /entities?type=InclusionCriterion &q=hasInclusionCriterion_inverse=="urn:ngsi-ld:Study:ONCO-423"
GET /entities?type=Study &q=clinicalTrialsGovId==null # Or via Sponsor traversal: GET /entities?type=Sponsor &q=belongsToOrganization=="urn:ngsi-ld:Organization:pfizer" &attrs=runs # Then for each Study, check clinicalTrialsGovId presence
GET /entities?type=Endpoint &q=endpointType=="PRIMARY" &q=hasEndpoint_inverse.studyPhase=="PHASE_3" &q=hasEndpoint_inverse.therapeuticArea=="ONCOLOGY"
GET /entities?type=StudySite &q=hasPrincipalInvestigator=="urn:ngsi-ld:Person:patel" &q=studySiteStatus=="ACTIVE" &attrs=forStudy # Then for each Study: GET /entities?type=Study &id=<studyId> &attrs=studyTitle,studyVersion,hasProtocol,hasSchedule
| Operator phrasing | Translated query shape | Discriminating predicate |
|---|---|---|
| "Show me Study X" | type=Study & studyId==X | Study identity |
| "What phase is this trial?" | type=Study & id==X → studyPhase | Study.studyPhase |
| "Who's enrolled in this trial?" | type=StudySite & forStudy==X → hasParticipant (when Participant lifts) | Traversal via StudySite |
| "What's the primary endpoint?" | type=Endpoint & hasEndpoint_inverse==X & endpointType==PRIMARY | Endpoint.endpointType |
| "Is this trial randomized?" | type=Study & id==X → allocation == "RANDOMIZED" | Study.allocation |
| "Is this trial blinded?" | type=Study & id==X → masking != "OPEN_LABEL" | Study.masking |
| "What sites are running this?" | type=StudySite & forStudy==X → forSite | StudySite traversal |
| "Which studies use Drug X?" | type=InvestigationalProduct → suppliedTo_inverse → Study (when IP horizontal lifts) | InvestigationalProduct traversal |
| "Show me Pfizer's Phase 3 oncology trials" | type=Study & studyPhase=="PHASE_3" & therapeuticArea=="ONCOLOGY" & runs_inverse.belongsToOrganization=="pfizer" | Multi-attribute filter + Sponsor traversal |
| "How many active studies do we have?" | type=Study & studyStatus IN {RECRUITING, ENROLLING_BY_INVITATION, ACTIVE_NOT_RECRUITING} → COUNT | Aggregate over studyStatus |
| "Has this trial enrolled its target?" | type=Study & id==X → actualEnrollment / targetEnrollment | Two-attribute ratio |
| "What's the SAP say?" | type=Study & id==X → hasStatisticalAnalysisPlan → Document | Study.hasStatisticalAnalysisPlan traversal |
| "When did the protocol last get amended?" | type=Amendment (when Amendment lifts) & relatedStudy==X → max(amendmentDate) | Amendment traversal |
| # | Invariant | Severity |
|---|---|---|
| 11 | Study at or past RECRUITING (statuses: RECRUITING / ENROLLING_BY_INVITATION / ACTIVE_NOT_RECRUITING / COMPLETED) must have at least one hasEndpoint. Study at PLANNED is exempt. | sh:Violation |
| 12 | Study at or past RECRUITING must have at least one hasInclusionCriterion. Study at PLANNED is exempt. | sh:Violation |
| 13 | Study at or past RECRUITING must have at least one hasSchedule (Schedule of Assessments). Study at PLANNED is exempt. | sh:Violation |
| 14 | Study with studyType=INTERVENTIONAL must have studyPhase populated. Observational, expanded-access, registry studies are exempt. | sh:Violation |
| 15 | Study with studyStatus=COMPLETED should have actualCompletionDate populated. Soft warning; data-entry verification. | sh:Warning |
| 16 | Study with interventionModel in {PARALLEL, CROSSOVER, FACTORIAL, SEQUENTIAL} must have multiple Arm sub-objects. Multi-arm models require multiple arms by definition. | sh:Violation |
| Invariant | Status |
|---|---|
| Multi-arm Study (numberOfArms attribute) must match COUNT of hasArm. Cross-attribute consistency. | v0.4 — needs numberOfArms attribute first |
| Study with studyStatus=RECRUITING must have at least one StudySite with studySiteStatus=ACTIVE. | v0.4 — cross-entity invariant |
| Study targetEnrollment > 0 when studyStatus in {RECRUITING, ENROLLING_BY_INVITATION, ACTIVE}. | v0.4 |
| Study with studyPhase=PHASE_4 should have at least one regulatory approval (post-marketing). | v0.4 — needs RegulatorySubmission |
| Study with multiple Sponsor entities must have at least one with hasOperationalResponsibility=true (covered by existing Sponsor invariant 4 but worth confirming at Study level). | Already covered by Sponsor invariant 4 |
| Standard | Mapping | Notes |
|---|---|---|
| FHIR R5 | fhir:ResearchStudy | FHIR's central trial resource. Sub-objects map to ResearchStudy.arm, ResearchStudy.objective, ResearchStudy.recruitment, etc. |
| USDM v3 | Study + StudyVersion + StudyDesign collapsed | Verified against cdisc-org/usdm; details in §5. The collapsing is reversible at projection time. |
| CDISC CDASH IG 2.1 | cdash:DM | Demographics domain captures study identification at the participant level. |
| CDISC SDTM | sdtm:TS / SE / TI | SDTM Trial Summary, Subject Elements, Trial Inclusion/Exclusion. Study-design content projects via SDTM TS variables. |
| ICH E8(R1) | Quality-by-design framework | See §6 for topic-by-topic mapping. |
| ICH E6(R3) Section 1, 2.5, 3.1, 3.10 | Conduct framework, sponsor design responsibility, quality management | See §6. |
| ClinicalTrials.gov ProtocolSection | Direct attribute mapping | studyType, studyPhase, interventionModel, allocation, masking, primaryPurpose, studyStatus all align directly with CT.gov enumerations. |
| EU CTIS / EudraCT | Multi-registry attributes | See §7. |
| OMOP CDM | (no direct equivalent at Study level) | Per-Participant data flowing through this Study projects to OMOP via StudySite → Participant traversal. OMOP itself doesn't model Study-as-trial; it captures observational data. |
| NCIt | NCIT:C63536 (Clinical Trial) | Closest single-term match. |
| W3C PROV | prov:Activity | The Study is an Activity in PROV terms; Sponsor and Site participate; the Protocol is a prov:Plan. |
| Issue | Status | Owner |
|---|---|---|
| StudyVersion sub-object lift for richer multi-version semantics (versioned design, multi-version diff queries). | v0.4 if operationally needed | Working group |
| Amendment horizontal lift. Currently flagged-missing on Study.hasAmendment; lifts in v0.3+ to enable amendment lineage tracking. | v0.3+ | Working group |
| Milestone horizontal lift. Currently flagged-missing on Study.hasMilestone. | v0.3+ | Working group |
| InvestigationalProduct top-level lift (one of the OOUX-locked 8). Required for Study.suppliesInvestigationalProduct and Sponsor.supplies. | v0.3+ | Working group |
| OversightBody top-level lift. Required for Study.hasOversightBody and StudySite.hasIRB. | v0.3+ | Working group |
| StudyStartupPackage horizontal lift. | v0.3+ | Working group |
| RiskAssessment horizontal lift (ICH E8(R1) quality-by-design). | v0.3+ | Working group |
| Tag horizontal lift. | v0.3+ | Working group |
| Pending Study SHACL invariants (numberOfArms-vs-COUNT consistency, RECRUITING needs ≥1 ACTIVE StudySite, targetEnrollment > 0 for active studies, PHASE_4 needs regulatory approval). | v0.4 | Translator scaffold v3 |
| Visit lift (top-level). When Visit lifts, the OOUX correction tracked on the Site spec applies: Visit should point at StudySite (not Site directly), and probably split into Visit-template vs Visit-occurrence. | v0.3+ | Working group |
| Activity sub-object lift (or top-level). Activity is the leaf in the Protocol → SOA → Visit-template → Activity definition chain. USDM has Activity at StudyDesign level. | v0.3+ | Working group |
| Endpoint enrichment: USDM has Endpoint inside Objective inside StudyDesign. TOP currently flattens; if richer Objective semantics become operationally needed, lift Objective as a sub-object. | v0.4 if needed | Working group |
| Long-tail registry promotion. otherRegistryIds is comma-separated for now; individual registries (JPRN, ChiCTR, ANZCTR, REBEC, etc.) may promote to attributes if they hit critical mass. | v0.4 if usage data warrants | Working group |
| Protocol amendment lineage in Protocol sub-object. Currently Protocol.protocolStatus has AMENDED + SUPERSEDED states but no explicit predecessor link. v0.3+ adds Protocol.supersedesProtocol to capture amendment chain. | v0.3+ | Working group |