sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo encontrar la relación de la base de datos Snomed Postgres Sql

De acuerdo con NHS CT Browser , que puede no ser accesible desde cualquier lugar, 93880001 tiene tres padres:

  • Tumor maligno de pulmón (trastorno)
  • Tumor maligno primario de órganos intratorácicos (trastorno)
  • Tumor maligno primario de las vías respiratorias (trastorno)

y 31 hijos:

  • Carcinoma de parénquima pulmonar (trastorno)
  • Hemangioendotelioma epitelioide de pulmón (trastorno)
  • Linfoma de pulmón no Hodgkin (trastorno)
  • Cáncer de pulmón de células no pequeñas (trastorno)
  • y así sucesivamente...

La forma de encontrar niveles superiores e inferiores de la jerarquía es usar relationship_f.sourceid y relationship_f.destinationid . Sin embargo, las tablas sin procesar no son fáciles de usar, por lo que sugeriría hacer algunas vistas. Tomé el código de los archivos Oracle .sql en esto repositorio de GitHub.

Primero, hacemos una vista con ID de concepto y nombres preferidos:

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

Luego hacemos una vista de las relaciones:

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;

Entonces, una consulta para imprimir los nombres y las identificaciones de los tres conceptos principales sería:

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

Tenga en cuenta que esto en realidad devuelve tres conceptos adicionales, que el navegador SNOMED en línea considera obsoletos. No estoy seguro de por qué.

Para imprimir los nombres y las identificaciones de los conceptos secundarios, reemplace destinationId con sourceId :

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

Tenga en cuenta que esto en realidad devuelve dieciséis conceptos adicionales, que el navegador SNOMED en línea considera obsoletos. Nuevamente, no puedo encontrar una forma confiable de excluir solo estos dieciséis de los resultados.

A partir de aquí, las consultas para obtener abuelos y nietos son sencillas.