PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment trouver une relation à partir de la base de données Snomed Postgres Sql

Selon le NHS CT Browser , qui n'est peut-être pas accessible de partout, 93880001 a trois parents :

  • Tumeur maligne du poumon (trouble)
  • Tumeur maligne primitive des organes intrathoraciques (trouble)
  • Tumeur maligne primitive des voies respiratoires (trouble)

et 31 enfants :

  • Carcinome du parenchyme pulmonaire (trouble)
  • Hémangioendothéliome épithélioïde du poumon (trouble)
  • Lymphome pulmonaire non hodgkinien (trouble)
  • Cancer du poumon non à petites cellules (trouble)
  • et ainsi de suite...

La façon de trouver les niveaux supérieurs et inférieurs de la hiérarchie consiste à utiliser relationship_f.sourceid et relationship_f.destinationid . Cependant, les tables brutes ne sont pas conviviales, je suggérerais donc de faire quelques vues. J'ai pris le code des fichiers Oracle .sql dans ceci Dépôt GitHub.

Tout d'abord, nous créons une vue avec des ID de concept et des noms préférés :

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

Ensuite, nous faisons une vue des relations :

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;

Ainsi, une requête pour imprimer les noms et identifiants des trois concepts parents serait :

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

Notez que cela renvoie en fait trois concepts supplémentaires, que le navigateur en ligne SNOMED considère comme obsolètes. Je ne sais pas pourquoi.

Pour imprimer les noms et identifiants des concepts enfants, remplacez destinationId avec sourceId :

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

Notez que cela renvoie en fait seize concepts supplémentaires, que le navigateur en ligne SNOMED considère comme obsolètes. Encore une fois, je ne trouve pas de moyen fiable d'exclure uniquement ces seize des résultats.

À partir de là, les requêtes pour obtenir des grands-parents et des petits-enfants sont simples.