# $Id: RenalTransplantation.ttl,v 1.20 2014/09/23 09:11:33 eric Exp $
#
# ericP at the keyboard

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .

@prefix dt: <http://www.hl7.org/owl/iso-dt-2.0#> .
@prefix bridg: <http://www.bridgmodel.org/owl#> .

@prefix renal: <http://www.w3.org/2013/12/FDA-TA/renal#> .
@prefix xplant: <http://www.w3.org/2013/12/FDA-TA/transplant#> .
@prefix : <http://www.w3.org/2013/12/FDA-TA/RenalTransplantation#> .
@prefix core: <http://www.w3.org/2013/12/FDA-TA/core#> .
@prefix data: <http://www.w3.org/2013/12/FDA-TA/datatypes#> .

<http://www.w3.org/2013/12/FDA-TA/RenalTransplantation> a owl:Ontology ;
    owl:imports <http://www.w3.org/2013/12/FDA-TA/core> ,
                <http://www.w3.org/2013/12/FDA-TA/systemic> ,
                <http://www.w3.org/2013/12/FDA-TA/renal> ,
                <http://www.w3.org/2013/12/FDA-TA/transplant> .

:RenalTransplantProcedure rdfs:subClassOf xplant:TransplantProcedure .

# Restriction: { ?x a :KidneyGraftOutcomeAssessment }:: { ?x core:hasResultValue ?d . ?d a xplant:GraftViability }
:KidneyGraftOutcomeAssessment a owl:Class ;
    rdfs:subClassOf 
        core:FunctionOutcomeAssessment ,
        [ a owl:Restriction ;
          owl:onProperty core:hasResultValue ;
          owl:allValuesFrom xplant:GraftViability ] .

:KidneyGraftSurvivalAssessment a owl:Class ; # rename to KidneyGraftWithNormalFunction ?
    rdfs:subClassOf :KidneyGraftOutcomeAssessment , xplant:GraftSurvivalAssessment , core:PositiveOutcome .

:KidneyGraftLossAssessment a owl:Class ; # rename to NonFunctioningKidneyGraft ?
    rdfs:subClassOf :KidneyGraftOutcomeAssessment , xplant:GraftLossAssessment , core:NegativeOutcome .

:KidneyGraftCSARAssessment a owl:Class ;      
    rdfs:subClassOf :KidneyGraftOutcomeAssessment , xplant:GraftBPARAssessment .

:KidneyGraftBPARAssessment a owl:Class ;      
    rdfs:subClassOf :KidneyGraftOutcomeAssessment , xplant:GraftBPARAssessment , core:NegativeOutcome .



:DeathDueToRejection rdfs:subClassOf core:FunctionOutcomeAssessment .

# DefinedObservations are all in renal.ttl

#
# Endpoints
#
:GraftSurvival rdfs:subClassOf :AllEndpoints, core:EfficacyEndpoint ;
    core:sparqlQuery """
    SELECT ("GraftSurvival" AS ?endpoint) (COUNT(*) AS ?count) (GROUP_CONCAT(?name) AS ?labels)
    WHERE {
      BIND (1 AS ?g)
      [
        bridg:Subject.performingBiologicEntity [ foaf:name ?name ] ;
        core:hasOutcomeAssessment [
          a xplant:GraftSurvivalAssessment ]
      ]
    } GROUP BY ?g
""" .

:GraftLoss rdfs:subClassOf :AllEndpoints, core:EfficacyEndpoint ;
    core:sparqlQuery """
    SELECT ("GraftLoss" AS ?endpoint) (COUNT(*) AS ?count) (GROUP_CONCAT(?name) AS ?labels)
    WHERE {
      BIND (1 AS ?g)
      [
        bridg:Subject.performingBiologicEntity [ foaf:name ?name ] ;
        core:hasOutcomeAssessment [
          a xplant:GraftLossAssessment ]
      ]
    } GROUP BY ?g
""" .

:DecreasingGFR a core:TrendMonitor ;
    core:sparqlQuery """
    SELECT ("DecreasingGFR" AS ?endpoint) (COUNT(*) AS ?count) (GROUP_CONCAT(?label) AS ?labels)
    WHERE {
      BIND (1 AS ?g)
      [ 
        bridg:Subject.performingBiologicEntity [ foaf:name ?name ] ;
        core:hasOutcomeAssessment ?oa ] .
          ?oa a renal:RenalFunctionOutcomeAssessment ; core:hasObservationTime ?when .
	  BIND (CONCAT(?name, '(', STR(?when), ')') AS ?label)
          { SELECT ?oa { ?oa core:hasObservation [ a renal:GfrFlowRateObservation ] } GROUP BY ?oa } # over GFRs
          MINUS { # occurances of GFR increasing with date
            ?oa core:hasObservation
                    [ a renal:GfrFlowRateObservation ; core:hasObservationTime ?date1 ; core:hasResultValue [ data:value ?gfr1 ] ] ,
                    [ a renal:GfrFlowRateObservation ; core:hasObservationTime ?date2 ; core:hasResultValue [ data:value ?gfr2 ] ]
            FILTER (?date2 > ?date1 && ?gfr2 > ?gfr1)
          }
    } GROUP BY ?g
""" .

:IncreasingSCr a core:TrendMonitor ;
    core:dependsOn renal:SerumCreatinineObservation ;
    core:sparqlQuery """
    SELECT ("IncreasingSCr" AS ?endpoint) (COUNT(*) AS ?count) (GROUP_CONCAT(?label) AS ?labels)
    WHERE {
      BIND (1 AS ?g)
      [ 
        bridg:Subject.performingBiologicEntity [ foaf:name ?name ] ;
        core:hasOutcomeAssessment ?oa ] .
          ?oa a renal:RenalFunctionOutcomeAssessment ; core:hasObservationTime ?when .
	  BIND (CONCAT(?name, '(', STR(?when), ')') AS ?label)
          { SELECT ?oa { ?oa core:hasObservation [ a renal:SerumCreatinineObservation ] } GROUP BY ?oa } # over SCrs
          MINUS { # occurances of SCr decreasing with date
            ?oa core:hasObservation
                    [ a renal:SerumCreatinineObservation ; core:hasObservationTime ?date1 ; core:hasResultValue [ data:value ?scr1 ] ] ,
                    [ a renal:SerumCreatinineObservation ; core:hasObservationTime ?date2 ; core:hasResultValue [ data:value ?scr2 ] ]
            FILTER (?date2 > ?date1 && ?scr2 < ?scr1)
          }
    } GROUP BY ?g
""" .

:AcuteRejection rdfs:subClassOf :AllEndpoints, core:EfficacyEndpoint ;
    skos:definition "Rejection of a transplanted organ that usually occurs after the first week of the transplantation. The risk of acute rejection is highest in the first three months following transplantation. Morphologically, there is an inflammatory infiltrate composed of lymphocytes and neutrophils and vascular damage in the rejected tissue." ;
    core:dependsOn :KidneyGraftCSARAssessment ;
    core:sparqlQuery """
    SELECT ("AcuteRejection" AS ?endpoint) (COUNT(*) AS ?count) (GROUP_CONCAT(?label) AS ?labels)
    WHERE {
      BIND (1 AS ?g)
      [
        bridg:Subject.performingBiologicEntity [ foaf:name ?name ] ;
        core:hasOutcomeAssessment ?oa ] .
          { SELECT ?oa ?l { ?oa core:afterIntervention [ bridg:PerformedActivity.instantiatedDefinedActivity [ rdfs:label ?l ] ] } GROUP BY ?oa ?l } # over SCrs
          BIND (CONCAT(?name, '(', ?l, ")") AS ?label)

          ?oa core:hasResultValue renal:CeasedToFunction .
    } GROUP BY ?g
""" .


##### clinical disease assessments:
:Assessment rdfs:subClassOf core:Assessment .

:AllograftGlomerulopathy rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:ArteriolarHyalineThickening rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:MesangialMatrixIncrease rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:MononuclearCellInterstitialInflammation rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:VascularFibrousIntimalThickening rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:EarlyAllograftGlomerulitis rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:IntimalArteritis rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:C4dStatus rdfs:subClassOf :Assessment ;
    skos:definition "@@missing" .

:Tubulitis rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:TubularAtrophy rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:InterstitialFibrosis rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:Diabetes rdfs:subClassOf :Assessment ;
    skos:definition "@@missing" .

:HypertensiveNephrosclerocis rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:PolycisticKidneyDisease rdfs:subClassOf :Assessment ;
    skos:definition "A hereditary condition that results in the formation of cysts throughout the kidneys. Patients with PKD often require kidney transplantation." .

:GlomerularDiseases rdfs:subClassOf :Assessment ;
    skos:definition "@@empty" .

:Hypertension rdfs:subClassOf :Assessment ;
    skos:definition "@@missing" .

:DiseaseAssessment rdfs:subClassOf :Assessment .

:Infection a :DiseaseAssessment ;
    skos:definition "@@missing" .

:ProgressiveMultifocalLeukoencephalopathy a :DiseaseAssessment ;
    skos:definition "@@missing" .

:PostTransplantLymphoproliferativeDisorder a :DiseaseAssessment ;
    skos:definition "@@missing" .


# Organization tricks

:Organizer a owl:Class . # organizer for RenalTransplantation .
:Subject rdfs:subClassOf :Organizer .
:Protocol rdfs:subClassOf :Organizer .
:AllEndpoints a owl:Class ; rdfs:subClassOf :Organizer ;
    owl:disjointUnionOf (
        :GraftSurvival 
        :GraftLoss 
        :AcuteRejection 
        core:Death 
        core:LTFU #  :DecreasingGFR :IncreasingSCr 
    ) .

:Protocol 
    rdfs:subClassOf :Organizer, core:TAProtocol ,
        [ owl:onProperty :hasEfficacyEndpoint ; owl:someValuesFrom :AllEndpoints ] .

