├── .idea ├── demo1.iml ├── misc.xml └── modules.xml ├── README.md └── py_construct.py /.idea/demo1.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python操作知识图谱数据库 2 | ------ 3 | ![](http://p20tr36iw.bkt.clouddn.com/graph.jpg) 4 | 5 | ```python 6 | pip install py2neo==2.0.8 7 | ``` 8 | ## 1.安装Neo4J 9 | 10 | ### 官网下载Neo4J的zip包,然后解压,将neo4j_path/bin配入path中,进入bin目录运行 11 | ```python 12 | neo4j.bat console 13 | ``` 14 | ## 2.运行Neo4J 15 | ![](http://p20tr36iw.bkt.clouddn.com/neo4j.png) 16 | 17 | ### 浏览器输入:http://localhost:7474,初始用户名与密码均为neo4j 18 | 19 | ## 3.Python操作Neo4J 20 | ### 3.1 py2neo安装 21 | ```python 22 | pip install py2neo 23 | ``` 24 | ### 3.2 py2neo连接neo4j 25 | ```python 26 | from py2neo import Graph 27 | def __init__(self): 28 | # 建立连接 29 | link = Graph("http://localhost:7474", username="neo4j", password="***") 30 | self.graph=link 31 | 32 | ``` 33 | ### 3.3 py2neo清空数据库结点与边 34 | ```python 35 | def clean_node(self): 36 | # 清空数据库 37 | self.graph.delete_all() 38 | ``` 39 | >注意:此时会发现Property Keys未删除,要想删除只有找到你的数据库data/graph.db里面全部删除掉才可以。 40 | ### 3.4 py2neo创建结点 41 | >创建结点是会发现label需要传参,那么label到底是什么呢?在neo4j中不存在表的概念,可以把label当作表, 42 | 相当于在创建多个结点时,指定其为同一label,就类似于为这几个结点(关系型数据库中类似与字段)储存到一张表中。 43 | 44 | 为了更好的描述疾病、药物等的构建,参考以下ER图进行构建 45 | 46 | ![](http://p20tr36iw.bkt.clouddn.com/rela.png) 47 | 48 | ```python 49 | from py2neo import Node 50 | def create_node(self): 51 | # 疾病、临床表现、药物等结点定义 52 | for each_dis in dis_list: 53 | dis_node=Node(dis_label,name=each_dis) 54 | self.graph.create(dis_node) 55 | 56 | for each_cli in cli_list: 57 | cli_node = Node(cli_label, name=each_cli) 58 | self.graph.create(cli_node) 59 | 60 | for each_sdef in drug_list: 61 | drug_node = Node(dru_label, name=each_sdef) 62 | self.graph.create(drug_node) 63 | 64 | for each_sdef in sdef_list: 65 | sdef_node=Node(side_effect_label,name=each_sdef) 66 | self.graph.create(sdef_node) 67 | 68 | for each_zd in zd_method_list: 69 | zd_node=Node(diagnostic_label,name=each_zd) 70 | self.graph.create(zd_node) 71 | ``` 72 | ### 3.5 py2neo创建关系 73 | 74 | >一个难点:取结点操作 75 | 76 | ```python 77 | # 取结点,使用find_one()方法,通过指定label,property_key, property_key获取相应的结点 78 | hyp = self.graph.find_one( 79 | label=dis_label, 80 | property_key="name", 81 | property_key="高血压" 82 | ) 83 | 84 | ``` 85 | >结点关系方法封装 86 | 87 | ```python 88 | from py2neo import Relationship 89 | def create_Rel(self): 90 | """ 91 | 建立关系 92 | 高血压疾病与临床表现之间的双向关系定义 93 | :return: 94 | """ 95 | # 获取高血压与糖尿病结点,然后通过循环,建立这两个疾病与临床表现的关系 96 | hyp_node = self.graph.find_one( 97 | label=dis_label, 98 | property_key="name", 99 | property_value="高血压" 100 | ) 101 | tnb_node = self.graph.find_one( 102 | label=dis_label, 103 | property_key="name", 104 | property_value="糖尿病" 105 | ) 106 | # 建立疾病与临床表现的关系 107 | for cli_name in cli_list: 108 | cli_node = self.graph.find_one( 109 | label=cli_label, 110 | property_key="name", 111 | property_value=cli_name 112 | ) 113 | hyp_to_cli = Relationship(hyp_node, '产生', cli_node) 114 | self.graph.create(hyp_to_cli) 115 | tnb_to_cli = Relationship(tnb_node, '产生', cli_node) 116 | self.graph.create(tnb_to_cli) 117 | # 建立疾病与诊断方法之间的关系 118 | for diag_name in zd_method_list: 119 | diag_node = self.graph.find_one( 120 | label=diagnostic_label, 121 | property_key="name", 122 | property_value=diag_name 123 | ) 124 | if diag_name=="血糖" and diag_name=="血脂" and diag_name=="胆固醇": 125 | diag_to_dis = Relationship(diag_node, '辅助检查', tnb_node) 126 | else: 127 | diag_to_dis = Relationship(diag_node, '辅助检查', hyp_node) 128 | self.graph.create(diag_to_dis) 129 | # 建立疾病与药物关系 130 | for drug_name in drug_list: 131 | drug_node = self.graph.find_one( 132 | label=dru_label, 133 | property_key="name", 134 | property_value=drug_name 135 | ) 136 | if drug_name=="胰岛素" or drug_name=="胰高血糖素": 137 | drug_to_disease=Relationship(drug_node,'治疗',tnb_node) 138 | else: 139 | drug_to_disease= Relationship(drug_node, '治疗', hyp_node) 140 | self.graph.create(drug_to_disease) 141 | 142 | # 建立药物与副作用之间的关系 143 | for drug_name in drug_list: 144 | drug_node = self.graph.find_one( 145 | label=dru_label, 146 | property_key="name", 147 | property_value=drug_name 148 | ) 149 | for sdef_name in sdef_list: 150 | sdef_node = self.graph.find_one( 151 | label=side_effect_label, 152 | property_key="name", 153 | property_value=sdef_name 154 | ) 155 | 156 | if drug_name == "利尿药" and sdef_name == "尿酸升高": 157 | drug_to_sdef = Relationship(drug_node, '引发', sdef_node) 158 | self.graph.create(drug_to_sdef) 159 | elif drug_name == "钙拮抗药" and sdef_name == "血钾降低": 160 | drug_to_sdef = Relationship(drug_node, '引发', sdef_node) 161 | self.graph.create(drug_to_sdef) 162 | elif drug_name == "胰岛素" and (sdef_name == "恶心" or sdef_name == "呕吐"): 163 | drug_to_sdef = Relationship(drug_node, '引发', sdef_node) 164 | self.graph.create(drug_to_sdef) 165 | elif drug_name == "胰高血糖素" and (sdef_name == "头晕" or sdef_name == "眼花"): 166 | drug_to_sdef = Relationship(drug_node, '引发', sdef_node) 167 | self.graph.create(drug_to_sdef) 168 | ``` 169 | 170 | ### 3.6 调用 171 | 172 | ### 上述代码全部封装在createBHPData类中,需要实例化对象,然后调用相应方法。 173 | 174 | ```python 175 | c=createBHPData() 176 | c.clean_node() 177 | c.create_node() 178 | c.create_Rel() 179 | ``` 180 | 181 | >最后,刷新浏览器版neo4j,然后就可以看到自己的图了。 182 | 183 | 184 | ## 4.项目地址:[点击这里,欢迎Star!](https://github.com/Light-City/PyToNeo4J) 185 | -------------------------------------------------------------------------------- /py_construct.py: -------------------------------------------------------------------------------- 1 | from py2neo import Graph,Node,Relationship,NodeSelector 2 | 3 | # 疾病 4 | dis_list = ["糖尿病", "高血压"] 5 | # 临床表现 6 | cli_list = ["肾脏损害", "心脏损害", "脑部损害", "大小动脉损害"] 7 | # 药物 8 | drug_list = ["利尿药", "钙拮抗药", "胰岛素", "胰高血糖素"] 9 | # 诊断方法 10 | zd_method_list = ["血脂", "血糖", "胆固醇", "超声心动图", "心电图", "肝功能", "肾功能"] 11 | # 副作用 12 | sdef_list = ["恶心", "呕吐", "头晕", "眼花","血钾降低","尿酸升高"] 13 | # 定义三个label 14 | dis_label = "疾病" # 定义疾病label 15 | cli_label = "临床表现" # 定义临床表现label 16 | dru_label = "药物" # 定义药物label 17 | side_effect_label="副作用"# 定义副作用label 18 | diagnostic_label="诊断方法"# 定义诊断label 19 | class createBHPData(object): 20 | def __init__(self): 21 | # 建立连接 22 | link = Graph("http://localhost:7474", username="neo4j", password="xxxx") 23 | self.graph=link 24 | def clean_node(self): 25 | # 清空数据库 26 | self.graph.delete_all() 27 | def create_node(self): 28 | # 疾病、临床表现、药物等结点定义 29 | for each_dis in dis_list: 30 | dis_node=Node(dis_label,name=each_dis) 31 | self.graph.create(dis_node) 32 | 33 | for each_cli in cli_list: 34 | cli_node = Node(cli_label, name=each_cli) 35 | self.graph.create(cli_node) 36 | 37 | for each_sdef in drug_list: 38 | drug_node = Node(dru_label, name=each_sdef) 39 | self.graph.create(drug_node) 40 | 41 | for each_sdef in sdef_list: 42 | sdef_node=Node(side_effect_label,name=each_sdef) 43 | self.graph.create(sdef_node) 44 | 45 | for each_zd in zd_method_list: 46 | zd_node=Node(diagnostic_label,name=each_zd) 47 | self.graph.create(zd_node) 48 | def create_Rel(self): 49 | """ 50 | 建立关系 51 | 高血压疾病与临床表现之间的双向关系定义 52 | :return: 53 | """ 54 | # 获取高血压与糖尿病结点,然后通过循环,建立这两个疾病与临床表现的关系 55 | hyp_node = self.graph.find_one( 56 | label=dis_label, 57 | property_key="name", 58 | property_value="高血压" 59 | ) 60 | tnb_node = self.graph.find_one( 61 | label=dis_label, 62 | property_key="name", 63 | property_value="糖尿病" 64 | ) 65 | # 建立疾病与临床表现的关系 66 | for cli_name in cli_list: 67 | cli_node = self.graph.find_one( 68 | label=cli_label, 69 | property_key="name", 70 | property_value=cli_name 71 | ) 72 | hyp_to_cli = Relationship(hyp_node, '产生', cli_node) 73 | self.graph.create(hyp_to_cli) 74 | tnb_to_cli = Relationship(tnb_node, '产生', cli_node) 75 | self.graph.create(tnb_to_cli) 76 | # 建立疾病与诊断方法之间的关系 77 | for diag_name in zd_method_list: 78 | diag_node = self.graph.find_one( 79 | label=diagnostic_label, 80 | property_key="name", 81 | property_value=diag_name 82 | ) 83 | if diag_name=="血糖" and diag_name=="血脂" and diag_name=="胆固醇": 84 | diag_to_dis = Relationship(diag_node, '辅助检查', tnb_node) 85 | else: 86 | diag_to_dis = Relationship(diag_node, '辅助检查', hyp_node) 87 | self.graph.create(diag_to_dis) 88 | # 建立疾病与药物关系 89 | for drug_name in drug_list: 90 | drug_node = self.graph.find_one( 91 | label=dru_label, 92 | property_key="name", 93 | property_value=drug_name 94 | ) 95 | if drug_name=="胰岛素" or drug_name=="胰高血糖素": 96 | drug_to_disease=Relationship(drug_node,'治疗',tnb_node) 97 | else: 98 | drug_to_disease= Relationship(drug_node, '治疗', hyp_node) 99 | self.graph.create(drug_to_disease) 100 | 101 | # 建立药物与副作用之间的关系 102 | for drug_name in drug_list: 103 | drug_node = self.graph.find_one( 104 | label=dru_label, 105 | property_key="name", 106 | property_value=drug_name 107 | ) 108 | for sdef_name in sdef_list: 109 | sdef_node = self.graph.find_one( 110 | label=side_effect_label, 111 | property_key="name", 112 | property_value=sdef_name 113 | ) 114 | 115 | if drug_name == "利尿药" and sdef_name == "尿酸升高": 116 | drug_to_sdef = Relationship(drug_node, '引发', sdef_node) 117 | self.graph.create(drug_to_sdef) 118 | elif drug_name == "钙拮抗药" and sdef_name == "血钾降低": 119 | drug_to_sdef = Relationship(drug_node, '引发', sdef_node) 120 | self.graph.create(drug_to_sdef) 121 | elif drug_name == "胰岛素" and (sdef_name == "恶心" or sdef_name == "呕吐"): 122 | drug_to_sdef = Relationship(drug_node, '引发', sdef_node) 123 | self.graph.create(drug_to_sdef) 124 | elif drug_name == "胰高血糖素" and (sdef_name == "头晕" or sdef_name == "眼花"): 125 | drug_to_sdef = Relationship(drug_node, '引发', sdef_node) 126 | self.graph.create(drug_to_sdef) 127 | 128 | c=createBHPData() 129 | c.clean_node() 130 | c.create_node() 131 | c.create_Rel() --------------------------------------------------------------------------------