sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man hittar relation från Snomed Postgres SQL-databas

Enligt NHS CT Browser , som kanske inte är tillgänglig överallt, 93880001 har tre föräldrar:

  • Malign tumör i lungan (störning)
  • Primär malign neoplasm i intratorakala organ (störning)
  • Primär malign neoplasm i luftvägarna (störning)

och 31 barn:

  • Karcinom av lungparenkym (störning)
  • Epiteloid hemangioendoteliom i lungan (störning)
  • Icke-Hodgkins lunglymfom (störning)
  • Icke-småcellig lungcancer (störning)
  • och så vidare...

Sättet att hitta högre och lägre nivåer i hierarkin är att använda relationship_f.sourceid och relationship_f.destinationid . Raw-tabellerna är dock inte användarvänliga så jag föreslår att du gör några synpunkter. Jag har tagit koden från Oracle .sql-filerna i det här GitHub-repo.

Först gör vi en vy med koncept-ID:n och föredragna namn:

create view conceptpreferredname as
SELECT distinct c.id conceptId, d.term preferredName, d.id descriptionId
FROM postgres.snomedct.concept_f c
inner JOIN postgres.snomedct.description_f d
  ON c.id = d.conceptId
  AND d.active = '1'
  AND d.typeId = '900000000000013009'
inner JOIN postgres.snomedct.langrefset_f l
  ON d.id = l.referencedComponentId
  AND l.active = '1'
  AND l.refSetId = '900000000000508004'  -- GB English
  AND l.acceptabilityId = '900000000000548007';

Sedan gör vi en syn på relationer:

CREATE VIEW relationshipwithnames AS
SELECT id, effectiveTime, active,
    moduleId, cpn1.preferredName moduleIdName,
    sourceId, cpn2.preferredName sourceIdName,
    destinationId, cpn3.preferredName destinationIdName,
    relationshipGroup,
    typeId, cpn4.preferredName typeIdName,
    characteristicTypeId, cpn5.preferredName characteristicTypeIdName,
    modifierId, cpn6.preferredName modifierIdName
from postgres.snomedct.relationship_f relationship,
    conceptpreferredname cpn1,
    conceptpreferredname cpn2,
    conceptpreferredname cpn3,
    conceptpreferredname cpn4,
    conceptpreferredname cpn5,
    conceptpreferredname cpn6
WHERE moduleId = cpn1.conceptId
AND sourceId = cpn2.conceptId
AND destinationId = cpn3.conceptId
AND typeId = cpn4.conceptId
AND characteristicTypeId = cpn5.conceptId
AND modifierId = cpn6.conceptId;

Så en fråga för att skriva ut namn och ID för de tre överordnade koncepten skulle vara:

select *
from relationshipwithnames r
where r.sourceId = '93880001'
and r.active = '1'
and r.typeIdName = 'Is a';

Observera att detta faktiskt returnerar tre extra koncept, som webbläsaren SNOMED online tycker är föråldrade. Jag är inte säker på varför.

För att skriva ut namn och ID för underordnade koncept, byt ut destinationId med sourceId :

select *
from relationshipwithnames r
where r.destinationId = '93880001'
and r.active = '1'
and r.typeIdName = 'Is a';

Observera att detta faktiskt returnerar sexton extra koncept, som webbläsaren SNOMED online tycker är föråldrade. Återigen, jag kan inte hitta ett tillförlitligt sätt att utesluta endast dessa sexton från resultaten.

Härifrån är frågor för att få mor- och farföräldrar och barnbarn enkla.




  1. PL/SQL - Hur man använder en array i en IN-klausul

  2. Datageneratorer för SQL-server?

  3. Problem med JOOQ json-bindning

  4. Migrera en Oracle-databas från AWS EC2 till AWS RDS, del 2