sql >> Database >  >> RDS >> PostgreSQL

Hoe een relatie te vinden uit Snomed Postgres Sql Database

Volgens de NHS CT-browser , die mogelijk niet overal toegankelijk is, heeft 93880001 drie ouders:

  • Maligne longtumor (aandoening)
  • Primair maligne neoplasma van intrathoracale organen (aandoening)
  • Primair maligne neoplasma van de luchtwegen (aandoening)

en 31 kinderen:

  • Carcinoom van longparenchym (aandoening)
  • Epithelioïde hemangio-endothelioom van de long (aandoening)
  • Non-Hodgkin-lymfoom van de long (aandoening)
  • Niet-kleincellige longkanker (aandoening)
  • en ga zo maar door...

De manier om hogere en lagere niveaus van de hiërarchie te vinden, is door relationship_f.sourceid te gebruiken en relationship_f.destinationid . De onbewerkte tabellen zijn echter niet gebruiksvriendelijk, dus ik zou willen voorstellen om enkele weergaven te maken. Ik heb de code overgenomen uit de Oracle .sql-bestanden in dit GitHub-opslagplaats.

Eerst maken we een weergave met concept-ID's en voorkeursnamen:

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';

Vervolgens maken we een beeld van relaties:

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;

Dus een vraag om de namen en id's van de drie bovenliggende concepten af ​​te drukken zou zijn:

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

Merk op dat dit in feite drie extra concepten oplevert, waarvan de online SNOMED-browser denkt dat ze achterhaald zijn. Ik weet niet zeker waarom.

Om de namen en id's van onderliggende concepten af ​​te drukken, vervangt u destinationId met sourceId :

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

Merk op dat dit in feite zestien extra concepten oplevert, die volgens de online SNOMED-browser achterhaald zijn. Nogmaals, ik kan geen betrouwbare manier vinden om alleen deze zestien van de resultaten uit te sluiten.

Vanaf hier zijn vragen om grootouders en kleinkinderen te krijgen eenvoudig.




  1. Sqlalchemie met postgres. Probeer 'DISTINCT ON' te krijgen in plaats van 'DISTINCT'

  2. Wat is het verschil tussen VARCHAR(255) en TINYTEXT-tekenreeksen in MySQL?

  3. AssertionError:databaseverbinding is niet ingesteld op UTC

  4. Welsprekende groep Door SQLSTATE [42000] te maken met geldige SQL-query in Laravel 5.3