# Template for N3 document
# Allows use of unprefixed names instead of :name style names
@keywords a, has, is, of, this.
@prefix : <#>.
#
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix skos: <http://www.w3.org/2004/02/skos/core#>.
@prefix owl: <http://www.w3.org/2002/07/owl#>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
@prefix dc: <http://http://purl.org/dc/terms/>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.
#
# Identify the document
# =====================================================================
# 12345678 - MM DIAGNOSTIC DIGITAL BILAT
# Patient: Mary Kay SMITH -- History #AB98765
# BILATERAL DIGITAL DIAGNOSTIC MAMMOGRAM POST LUMPECTOMY MAMMOGRAM:
# 1/1/2009
# CLINICAL: 611.72 Lump Or Mass In Breast-611.72 Patient with palpable
# abnormality in left breast. Post left lumpectomy. Recent MRI
# demonstrated suspicious lesions in left breast.
# ---------------------------------------------------------------------
<> = this.
# to make this more English-like, I give the document a name; "theDocument"
this interprets dc:identifier "12345678"; has permanentURL <http://theHospital.com/2009/01/01/12345678>; is a MammogramReport; has foaf:topic thePatient].
# some basic information about theDocument:
# - it has an identifier (this could be the hospital report number);
# - it has (ideally) a permanent url;
# - the genre of the report is a mammogram report;
# - its topic is thePatient (see below).
thePatient is a Patient; is skos:example PatientConcept; has foaf:familyName "Smith"; has foaf:givenName "Mary Kay"; has medicalRecordNumber "AB98765".
theRadiologist = [a Radiologist; dc:author theDocument; foaf:name "Fred Flintstone"].
# some basic information about thePatient:
# - she is a patient (member of some rdf class "Patient", about which possibly more later);
# - if we can't find an appropriate rdf/owl class, we at least can say that she is a skos:example of a skos:Concept "PatientConcept" -- we should be able to find that in some (not necessarilly rdf/owl) terminology someplace!!
# - we use foaf for some basic information about her name; we probably need a more rigorous demographic vocabulary for this sort of document
# - we specify her medical record number, and certainly we need a good vocabulary for this
theDocument has dc:title "BILATERAL DIGITAL DIAGNOSTIC MAMMOGRAM POST LUMPECTOMY MAMMOGRAM"; has dc:date "2009-01-01"^^dc:W3CDTF; has dc:subject theProcedure.
theProcedure is a Procedure; is a DigitalMammogram; has target thePatient; has laterality bilateral.
# how to model Clinical History is very dependent
# on whether you wish to model this as Facts or as (maybe even defeasible)
# assertions.
# Here's the way I proposed it in the CSHALS presentation:
<http://acmehospital.org/123456789> = theSource.
theRadiologist foaf:name "Kenneth Kirk".
<> = this.
theSource is a foaf:Document;
has dc:identifier "12345679";
has dc:date "2009-01-01"^^xsd:date;
dc:author theRadiologist; has dc:author [foaf:name "Jenny Jones"]; has dc:publisher [foaf:name "Acme Hospital"].
this is a void:Dataset;
has dc:source theSource;
has dc:creator [foaf:name "John Madden"];
dc:issued "2010-12-31"^^xsd:date.
this interprets theSource.
theSource has grddl:result this.
# end CSHALS
# here is one way to do it:
thePatient has theClinicalHistory.
theClinicalHistory is a ClinicalHistory; = (theFinding-1, theFinding-2, theFinding-3).
theFinding-1 has dc:label "LUMP OR MASS IN BREAST"; = {thePatient has finding [a breastLump]}.
theFinding-2 has dc:label "palpable abnormality in left breast"; = {thePatient has finding [a Abnormality; locatedIn [a Breast; laterality left; inBody of thePatient]]}.
theFinding-3 has dc:label "Post left lumpectomy"; = {thePatient has finding [a CompletedLumpectomy; laterality left]}.
theFinding-4 has dc:label "Recent MRI demonstrated suspicious lesion in left breast"; = {thePatient has finding [a MRI; has result theMRIResult]}.
theMRIResult = {thePatient has finding [a Lesion; inBody of thePatient; has significance suspicious]}.
.
# the Description is best modeled using an "on-the-fly" vocabulary
aPriorMammomgram = [a MammogramReport; dated "2008-01-01"^^xsd:date; ].
aPriorBiopsy = [a UltrasoundBiopsyReport; dated "2007-01-01"^^xsd:date].
theDocument has part [= theDiagnosis; a Diagnosis; dc:author theRadiologist].
theRadiologist performs [a Comparison; between theDiagnosis, aPriorMammogram, aPriorBiopsy].
# or, theComparison is among (theDiagnosis, aPriorMammogram, aPriorBiopsy).
thePatient has [a RightBreast; = theRightBreast], [a LeftBreast; = theLeftBreast].
bothBreasts = (theRightBreast, theLeftBreast).
# Now it gets really interesting
# do I model this as a finding, or as a fact?
# also, how many findings are there in the report? 1, 2, many?
# here I've modeled it as a single finding, which is shared by both breasts
theRightBreast has finding someFibroglandularElements.
theLeftBreast has finding someFibroglandularElements.
someFibroglandularElements = [a Finding; a [a owl:Restriction; owl:onProperty refersTo; owl:minCardinality 2]].
# this is an interesting statement, in that it uses a
someFibroglandularElements has qualifier scattered.
# or if you want to get fancy, you could say, "the finding is of >1 fibroglandular element", something like this:
# here's more from the CSHALS:
# it's hard to imagine a medical document so elementary
## that it wouldn't reference at least
## two (2) non-identical entities!
theMassAt9 is a Mass.
theMassAt1 is a Mass.
theMassAt9 owl:differentFrom theMassAt1.
theSpecimen contains theMassAt9, theMassAt1.
# or, saving a line
#
theSpecimen contains [a Mass; = theMassAt9].
# theSpecimen contains [a Mass; = theMassAt1].
#
theMassAt9 owl:differentFrom theMassAt1.
# in fact, you might want to collect all instances
# that you define and declare an owl:AllDifferent class
# [a owl:AllDifferent] owl:distinctMembers
(theRadiologist, thePatient,
theMassAt9, theMassAt1… ).
this has foaf:topic thePatient.
thePatient is a Patient.
Patient is a skos:Concept.
# later add whatever mapping axioms you want
# (we favor using SKOS whenever possible)...
Patient has skos:broader foaf:Person;
has skos:closeMatch snomed:378243823, radlex:347439845,
loinc:473878943.
# or even add more forceful axioms
# (but beware of "ontological overcommitment")...
Patient is rdfs:subClassOf dc:Agent;
has owl:equivalentClass gom:Patient.
# these are pretty commonplace assertion types
# hard to imagine much structural variation here
# can pick a specific vocabulary later
theMassAt9 size [dimension [val "1.2"^^xsd:float; unit cm], [val "1.3"^^xsd:float; unit cm]].
# more sketchy, depends on chosen anatomy vocabulary
theMassAt9 location [a Location; in thePatient,
[a Breast; laterality left],
[rdfs:label "9:00"]].
# very sketchy
# these are modeled loosey-goosey as value partitions
# need no idea how e.g. Radlex might do this
theMassAt9 shape round.
theMassAt9 margin indistinct.
theMassAt9 echogenicity isoechoic.
# I (radiologist) am suspicious for malignancy.
theRadiologist suspects [a Malignancy].
# This mammogram is suspicious for malignancy.
{theMammogram shows [a Malignancy]} urw:hasUncertainty highProbability.
# The findings are suspicious for malignancy.
theLesion hasFeature X, Y.
{theLesion hasFeature X, Y} suggests {thePatient has [a Malignancy]}.
# The mass is suspicious for malignancy.
theMass hasAppearance malignantAppearance.
# The patient's category is Suspicious for Malignancy.
thePatient diagnosticCategory SuspiciousForMalignancy.
# The diagnosis is: "Suspicious for Malignancy".
theDiagnosis = "Suspicious for Malignancy".
# The diagnosis category is Suspicious for Malignancy.
theDiagnosis has diagnosticCategory SuspiciousForMalignancy.
# The report category is Suspicious for Malignancy.
this has diagnosticCategory SuspiciousForMalignancy.
# This patient should be managed according to the
# applicable Suspicious for Malignancy protocol.
# ???????
# end more from the CSHALS
# =====================================================================
# INTERNAL AXIOMS: Some assertions regarding the document-only resources in
# this interpretation
Patient is rdf:subClassOf foaf:Person.
Patient is a skos:Concept;
has skos:label of "patient".
MammogramReport is a foaf:Document.
# =====================================================================
# BACKGROUND AXIOMS: Some assertions regarding the background knowledge
# assumed by the interpreter (i.e. me, not the author)