├── .idea
├── demo1.iml
├── misc.xml
└── modules.xml
├── README.md
└── py_construct.py
/.idea/demo1.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Python操作知识图谱数据库
2 | ------
3 | 
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 | 
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 | 
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()
--------------------------------------------------------------------------------