# metamodel_version: 1.7.0
enum CausalPredicateEnum
  {
    causally_upstream_of__COMMA___positive_effect
    causally_upstream_of__COMMA___negative_effect
    causally_upstream_of
    immediately_causally_upstream_of
    causally_upstream_of_or_within
    causally_upstream_of_or_within__COMMA___negative_effect
    causally_upstream_of_or_within__COMMA___positive_effect
    regulates
    negatively_regulates
    positively_regulates
  }

enum InformationBiomacromoleculeCategory
  {
    GeneOrReferenceProtein
    ProteinIsoform
    MacromolecularComplex
    Unknown
  }

enum ModelStateEnum
  {
    production
    development
  }

type Activity
  {
    id: Uriorcurie!
    enabledBy: EnabledByAssociation
    molecularFunction: MolecularFunctionAssociation
    occursIn: CellularAnatomicalEntityAssociation
    partOf: BiologicalProcessAssociation
    hasInput: [MoleculeAssociation]
    hasPrimaryInput: MoleculeAssociation
    hasOutput: [MoleculeAssociation]
    hasPrimaryOutput: MoleculeAssociation
    causalAssociations: [CausalAssociation]
    provenances: [ProvenanceInfo]
  }

interface Association
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
  }

type BiologicalProcessAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    happensDuring: PhaseTermObject
    partOf: BiologicalProcessTermObject
    term: BiologicalProcessTermObject
  }

type BiologicalProcessTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type CausalAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    predicate: PredicateTermObject
    downstreamActivity: Activity
  }

type CellTypeAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    partOf: GrossAnatomyAssociation
    term: CellTypeTermObject
  }

type CellTypeTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type CellularAnatomicalEntityAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    partOf: CellTypeAssociation
    term: CellularAnatomicalEntityTermObject
  }

type CellularAnatomicalEntityTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

interface EnabledByAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    term: InformationBiomacromoleculeTermObject
  }

type EnabledByGeneProductAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    term: GeneProductTermObject
  }

type EnabledByProteinComplexAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    members: [GeneProductTermObject]
    term: ProteinComplexTermObject
  }

type EvidenceItem
  {
    term: EvidenceTermObject
    reference: PublicationObject
    withObjects: [Object]
    provenances: [ProvenanceInfo]
  }

type EvidenceTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type GeneProductTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type GrossAnatomicalStructureTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type GrossAnatomyAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    partOf: GrossAnatomyAssociation
    term: GrossAnatomicalStructureTermObject
  }

interface InformationBiomacromoleculeTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type Model
  {
    id: Uriorcurie!
    title: String
    taxon: TaxonTermObject
    status: ModelStateEnum
    comments: [String]
    activities: [Activity]
    objects: [Object]
    provenances: [ProvenanceInfo]
    queryIndex: QueryIndex
  }

type MolecularFunctionAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    term: MolecularFunctionTermObject
  }

type MolecularFunctionTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type MoleculeAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    term: MoleculeTermObject
  }

type MoleculeTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type Object
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type PhaseTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type PredicateTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type ProteinComplexTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

type ProvenanceInfo
  {
    contributor: [String]
    created: String
    date: String
    providedBy: [String]
  }

type PublicationObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
    abstractText: String
    fullText: String
  }

type QueryIndex
  {
    numberOfActivities: Integer
    numberOfEnabledByTerms: Integer
    numberOfCausalAssociations: Integer
    lengthOfLongestCausalAssociationPath: Integer
    numberOfStronglyConnectedComponents: Integer
    flattenedReferences: [PublicationObject]
    modelActivityMolecularFunctionTerms: [TermObject]
    modelActivityMolecularFunctionClosure: [TermObject]
    modelActivityOccursInTerms: [TermObject]
    modelActivityOccursInClosure: [TermObject]
    modelActivityPartOfTerms: [TermObject]
    modelActivityPartOfClosure: [TermObject]
    modelActivityHasInputTerms: [TermObject]
    modelActivityHasInputClosure: [TermObject]
    taxonClosure: [TermObject]
    annotonTerms: [TermObject]
  }

type TaxonTermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

interface TermAssociation
  {
    type: String
    evidence: [EvidenceItem]
    provenances: [ProvenanceInfo]
    term: TermObject
  }

interface TermObject
  {
    id: Uriorcurie!
    label: String
    type: Uriorcurie
    obsolete: Boolean
  }

