问题陈述:
从Snomed CT数据库中提取所有父母、祖父母、子女和孙子女
说明:
我正在尝试在本地框上建立snomed数据库,以提取特定概念(使用concept\u id)的关系(所有父项和子项)。
我已从https://download.nlm.nih.gov/umls/kss/IHTSDO20190131/SnomedCT_InternationalRF2_PRODUCTION_20190131T120000Z.zip下载snomed数据
然后我使用这里找到的脚本将数据导入Postgres SQL DBhttps://github.com/IHTSDO/snomed-database-loader/tree/master/PostgreSQL
但是我没有发现这些表之间的任何关系,因此我可以为一个特定的概念id(我尝试了肺癌93880001)找到父母、祖父母、子女和孙子孙女
下图包含表结构:
我非常感谢你的帮助和建议。
最佳答案
根据可能无法从任何地方访问的NHS CT Browser,93880001有三个父母:
肺恶性肿瘤(紊乱)
原发性胸内器官恶性肿瘤(疾病)
原发性呼吸道恶性肿瘤(疾病)
和31个孩子:
肺实质癌(紊乱)
肺上皮样血管内皮瘤(疾病)
肺非霍奇金淋巴瘤(疾病)
非小细胞肺癌(紊乱)
等等。。。
找到层次结构的高低级别的方法是使用relationship_f.sourceid
和relationship_f.destinationid
。但是,原始表不是用户友好的,所以我建议您提出一些看法。我从thisGitHub repo中的Oracle.sql文件中获取了代码。
首先,我们使用概念ID和首选名称创建一个视图:
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';
然后,我们对人际关系进行分析:
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;
因此,打印出三个父概念的名称和id的查询将是:
select *
from relationshipwithnames r
where r.sourceId = '93880001'
and r.active = '1'
and r.typeIdName = 'Is a';
注意,这实际上返回了三个额外的概念,在线SNOMED浏览器认为这是过时的。我不知道为什么。
要打印出子概念的名称和id,请将
destinationId
替换为sourceId
:select *
from relationshipwithnames r
where r.destinationId = '93880001'
and r.active = '1'
and r.typeIdName = 'Is a';
注意,这实际上返回了16个额外的概念,在线SNOMED浏览器认为这些概念已经过时。再说一次,我找不到一个可靠的方法来排除结果中只有这16个。
从这里开始,询问祖父母和孙子孙女的问题很简单。
关于postgresql - 如何从Snomed Postgres SQL数据库中查找关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56951658/