PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como encontrar o relacionamento do banco de dados Snomed Postgres Sql


De acordo com o Navegador NHS CT , que pode não estar acessível de todos os lugares, 93880001 tem três pais:
  • Tumor maligno do pulmão (distúrbio)
  • Neoplasia maligna primária de órgãos intratorácicos (distúrbio)
  • Neoplasia maligna primária do trato respiratório (distúrbio)

e 31 filhos:
  • Carcinoma do parênquima pulmonar (distúrbio)
  • Hemangioendotelioma epitelióide do pulmão (distúrbio)
  • Linfoma não Hodgkin do pulmão (distúrbio)
  • Câncer de pulmão de células não pequenas (distúrbio)
  • e assim por diante...

A maneira de encontrar níveis superiores e inferiores da hierarquia é usar relationship_f.sourceid e relationship_f.destinationid . No entanto, as tabelas brutas não são amigáveis, então sugiro fazer algumas visualizações. Peguei o código dos arquivos Oracle .sql em isto repositório do GitHub.

Primeiro, fazemos uma visualização com IDs de conceito e nomes preferenciais:
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';

Em seguida, fazemos uma visão das relações:
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;

Portanto, uma consulta para imprimir os nomes e ids dos três conceitos pai seria:
select *
from relationshipwithnames r
where r.sourceId = '93880001'
and r.active = '1'
and r.typeIdName = 'Is a';

Observe que isso realmente retorna três conceitos extras, que o navegador SNOMED online considera obsoletos. Não sei por quê.

Para imprimir os nomes e ids dos conceitos filhos, substitua destinationId com sourceId :
select *
from relationshipwithnames r
where r.destinationId = '93880001'
and r.active = '1'
and r.typeIdName = 'Is a';

Observe que isso realmente retorna dezesseis conceitos extras, que o navegador SNOMED online considera obsoletos. Novamente, não consigo encontrar uma maneira confiável de excluir apenas esses dezesseis dos resultados.

A partir daqui, as consultas para obter avós e netos são diretas.