原数据结构如下(csv格式)
entityid | entity | entitytag | property | valueid(父类id) | value | valuetag |
1567677479436235642 | 双花草珊瑚含片 | 药品 | 适应证 | 1638862635926913734 | 声音嘶哑 | 临床所见 |
1638862635926913734 | 声音嘶哑 | 临床所见 | 科室 | 1594101137029016465 | 胸外科 | 组织机构 |
1594101137029016465 | 胸外科 | 组织机构 | 子类 | 1594101137015432243 | 外科 | 组织机构 |
1594101137015432243 | 外科 | 组织机构 | 子类 | 1594101137032180015 | 临床科室 | 组织机构 |
1594101137032180015 | 临床科室 | 组织机构 | 子类 | 1608729910223600623 | 医疗机构业务科室 | 组织机构 |
1608729910223600623 | 医疗机构业务科室 | 组织机构 | 子类 | 1567677480284502502 | 组织机构 | 组织机构 |
查询"双花草珊瑚含片"所有子节点(树形结构)
PostgreSQL方式:
导入CSV数据至omaha表,查询语句如下:
with recursive r as
(
select t1.* from omaha t1 where t1.entityid = '1567677479711342720'
union all
select t2.* from omaha t2, r where t2.entityid = r.valueid
)
select * from r order by entityid asc;
Neo4j方式
-
导入CSV格式数据
将csv文件放入neo4j安装目录的import目录下
执行以下CQL导入CSV文件
:auto USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///small2.csv" as row
MERGE (subNode:医学知识库 {entityId: row.entityId, entity: row.entity, entityTag: row.entityTag})
MERGE (parentNode:医学知识库 {entityId: row.valueId, entity: row.value, entityTag: row.valueTag})
CREATE (subNode)-[:MedicalRelation {property: row.property}]->(parentNode);
创建索引
create index on :医学知识库 (entityId,entity,entityTag);
-
查询树形结构节点和关系
找到"双花草珊瑚含片"的第1层关系
MATCH (p:医学知识库 {entity: "双花草珊瑚含片"})-[r:MedicalRelation]->(parent:医学知识库)
return r,p,parent;
找到"双花草珊瑚含片"的所有关系(任意深度)
MATCH (p:医学知识库 {entity: "双花草珊瑚含片"})-[r:MedicalRelation*1..7]->(a:医学知识库)
RETURN p,r,a;
查询结果如下图