This document is a binding constraint on all data model decisions in Phases 3-16 of the SyRF platform evolution. Every field in the PRISMA 2020 flow diagram is mapped to a specific SyRF data model entity, field, and derivation rule. Implementation phases MUST NOT introduce data structures that make any derivation rule in this document impossible to execute.
Normative language: "MUST" indicates an absolute requirement. "SHALL" indicates mandatory behavior. "SHOULD" indicates a strong recommendation. "MAY" indicates optional behavior.
The PRISMA 2020 flow diagram has four template variants:
Variant
Review Type
Source Columns
Boxes
New review, databases/registers only
New
1 column
Reduced
New review, databases/registers + other sources
New
2 columns
Full (17 boxes)
Updated review, databases/registers only
Updated
1 column + previous studies
Reduced + box1
Updated review, databases/registers + other sources
Updated
2 columns + previous studies
Full + box1
SyRF targets the most comprehensive variant: "new review with databases, registers, and other sources" (17 boxes, 34 fields). The data model MUST support all 34 fields. The "updated review" boxes (box1) are deferred but the data model SHALL NOT preclude future support.
PRISMA 2020 distinguishes three levels of bibliographic granularity (Page et al., 2021; Rethlefsen et al., 2022). This section provides the binding mapping between PRISMA terminology and SyRF entities.
PRISMA Term
Definition
SyRF Entity
SyRF Scope
Relationship
Record
Individual citation retrieved from a database or source
Citation
Project-scoped
Immutable. One created per citation per import.
Record (deduplicated)
Unique bibliographic identity after duplicate removal
Publication (pmPublication)
System-scoped
Global. Accumulates best-of-breed metadata across all projects.
Report
Full-text document retrieved for eligibility assessment
Study with fullTextStatus tracking
Project-scoped
A record that has progressed to full-text retrieval.
Study
Unique research investigation (may have multiple reports)
Study (pmStudy) after dedup consolidation
Project-scoped
Multiple Citations may link to one Study.
Key invariants:
An Citation is NEVER deleted after creation (PRISMA requirement: per-source counting MUST remain derivable).
A Publication is NEVER deleted (system-scoped bibliographic identity persists even if all linked Citations are removed from projects).
A Study may have many Citations (after dedup confirms they represent the same research).
The fullTextStatus field on Study distinguishes between "record" and "report" in PRISMA terminology.
LET totalCitations = COUNT(study.citations) across all studies in project; LET uniqueStudies = COUNT(studies WHERE lifecycleStatus NOT IN (Duplicate, Merged)); RETURN totalCitations - uniqueStudies
12
PRISMA-01, DEDUP-01
8
excluded_automatic
Records marked ineligible by automation tools
Study.lifecycleStatus
COUNT(studies) WHERE studies.projectId = :projectId AND studies.lifecycleStatus = RemovedByAutomation
12, 16
PRISMA-01
9
excluded_other
Records removed for other pre-screening reasons
Study.lifecycleStatus
COUNT(studies) WHERE studies.projectId = :projectId AND studies.lifecycleStatus = RemovedOther
Records screened at title/abstract (databases/registers)
Study.citations[].sourceType, Study.lifecycleStatus, screening stage pool
COUNT(studies) WHERE studies.projectId = :projectId AND studies.lifecycleStatus = Active AND study HAS citation WITH sourceType IN (Database, Register) AND study ENTERED title/abstract screening stage pool
13, 14
PRISMA-01, SCR-05
Box 5: Records Excluded at Title/Abstract (Databases/Registers)¶
#
PRISMA Field
Description
SyRF Data Source
Derivation Rule
Phase
Req ID
14
records_excluded
Records excluded at title/abstract screening (databases/registers)
COUNT(studies) WHERE studies.projectId = :projectId AND study HAS citation WITH sourceType IN (Database, Register) AND FinalScreeningOutcome(titleAbstractProfileId) = Excluded
15
PRISMA-01, SCR-04
Box 6: Reports Sought for Retrieval (Databases/Registers)¶
#
PRISMA Field
Description
SyRF Data Source
Derivation Rule
Phase
Req ID
15
dbr_sought_reports
Reports sought for full-text retrieval (databases/registers)
COUNT(studies) WHERE studies.projectId = :projectId AND study HAS citation WITH sourceType IN (Database, Register) AND study.fullTextStatus IN (Sought, Retrieved, NotRetrieved) AND FinalScreeningOutcome(titleAbstractProfileId) = Included
12, 16
PRISMA-01
Box 7: Reports Not Retrieved (Databases/Registers)¶
COUNT(studies) WHERE studies.projectId = :projectId AND study HAS citation WITH sourceType IN (Database, Register) AND study.fullTextStatus = NotRetrieved
12, 16
PRISMA-01
Box 8: Reports Assessed for Eligibility (Databases/Registers)¶
#
PRISMA Field
Description
SyRF Data Source
Derivation Rule
Phase
Req ID
17
dbr_assessed
Reports assessed for eligibility at full-text (databases/registers)
Study.fullTextStatus, Study.citations[].sourceType, full-text screening stage pool
COUNT(studies) WHERE studies.projectId = :projectId AND study HAS citation WITH sourceType IN (Database, Register) AND study.fullTextStatus = Retrieved AND study ENTERED full-text screening stage pool
13, 14, 15
PRISMA-01, SCR-05
Box 9: Reports Excluded with Reasons (Databases/Registers)¶
#
PRISMA Field
Description
SyRF Data Source
Derivation Rule
Phase
Req ID
18
dbr_excluded
Reports excluded with reasons at full-text (databases/registers)
GROUP BY FinalScreeningOutcome(fullTextProfileId).annotation.primaryReason WHERE study HAS citation WITH sourceType IN (Database, Register) AND FinalScreeningOutcome(fullTextProfileId) = Excluded; FORMAT AS "{reason} (n={count})"
COUNT(studies) WHERE studies.projectId = :projectId AND study HAS citation WITH sourceType IN (Website, Organisation, CitationSearching, Other) AND study.fullTextStatus IN (Sought, Retrieved, NotRetrieved)
COUNT(studies) WHERE studies.projectId = :projectId AND study HAS citation WITH sourceType IN (Website, Organisation, CitationSearching, Other) AND study.fullTextStatus = NotRetrieved
12, 16
PRISMA-01
Box 14: Reports Assessed for Eligibility (Other Sources)¶
#
PRISMA Field
Description
SyRF Data Source
Derivation Rule
Phase
Req ID
21
other_assessed
Reports assessed for eligibility at full-text (other sources)
Study.fullTextStatus, Study.citations[].sourceType, full-text screening stage pool
COUNT(studies) WHERE studies.projectId = :projectId AND study HAS citation WITH sourceType IN (Website, Organisation, CitationSearching, Other) AND study.fullTextStatus = Retrieved AND study ENTERED full-text screening stage pool
13, 14, 15
PRISMA-01, SCR-05
Box 15: Reports Excluded with Reasons (Other Sources)¶
#
PRISMA Field
Description
SyRF Data Source
Derivation Rule
Phase
Req ID
22
other_excluded
Reports excluded with reasons at full-text (other sources)
GROUP BY FinalScreeningOutcome(fullTextProfileId).annotation.primaryReason WHERE study HAS citation WITH sourceType IN (Website, Organisation, CitationSearching, Other) AND FinalScreeningOutcome(fullTextProfileId) = Excluded; FORMAT AS "{reason} (n={count})"
Total studies included in the review (new + previous)
Study.lifecycleStatus
COUNT(studies) WHERE studies.projectId = :projectId AND studies.lifecycleStatus = Included (same as new_studies for non-updated reviews)
12, 16
PRISMA-01
26
total_reports
Total reports of included studies
Study.lifecycleStatus, Study.citations[]
LET includedStudies = studies WHERE lifecycleStatus = Included; SUM(COUNT(study.citations)) for each includedStudy (same as new_reports for non-updated reviews)
COUNT(studies) WHERE studies.projectId = :projectId AND studies.lifecycleStatus = Included AND study.metaAnalysisIncluded = true (requires future metaAnalysisIncluded boolean on Study)
16
PRISMA-01
28
total_reports_ma
Reports of studies included in meta-analysis
Study.metaAnalysisIncluded, Study.citations[]
LET maStudies = studies WHERE lifecycleStatus = Included AND metaAnalysisIncluded = true; SUM(COUNT(study.citations)) for each maStudy
Column 1 (Databases/Registers): sourceType IN (Database, Register)
Column 2 (Other Sources): sourceType IN (Website, Organisation, CitationSearching, Other)
Migration note: Existing SystematicSearch records have LibraryFileType (file format) but no sourceType. The sourceType field SHALL be nullable. Migration in Phase 7 adds the field; Phase 16 backfills where determinable (e.g., LibraryFileType.PubmedXml implies sourceType = Database). See requirement PRISMA-02.
The PRISMA 2020 flow diagram includes box 1 (previous_studies, previous_reports) for updated systematic reviews -- reviews that build upon a prior version. SyRF does not currently support the "updated review" workflow.
Decision: Box 1 fields are deferred. The data model SHALL NOT preclude future support:
The Study.lifecycleStatus enum MAY be extended with a PreviouslyIncluded value in a future phase.
The total_studies and total_reports fields (box 16) currently equal new_studies and new_reports (box 10) because there are no previous studies to add. When updated review support is added, box 16 SHALL become new_studies + previous_studies and new_reports + previous_reports.
No architectural changes are required to support this -- it is an additive data model extension.
Implication: For non-updated reviews, total_studies == new_studies and total_reports == new_reports. The PRISMA flow diagram generator MUST handle this equivalence correctly.
Three-Level Data Model Specification:three-level-data-model.md -- Formal entity specifications for Publication, Citation, and Study that this mapping references.