知识图谱系列之Neo4J
0.作者的话
1.安装Neo4J
2.运行Neo4J
3.Python操作Neo4J
3.1 py2neo安装
3.2 py2neo连接neo4j
3.3 清空数据库结点与边
3.4 py2neo创建结点
3.5 py2neo创建关系
3.6 调用
4.作者的话
0.作者的话
1.安装Neo4J
官网下载Neo4J的zip包,然后解压,将neo4j_path/bin配入path中,进入bin目录运行
neo4j.bat console
pip install py2neo==2.0.8
2.运行Neo4J
浏览器输入:http://localhost:7474,初始用户名与密码均为neo4j
3.Python操作Neo4J
3.1 py2neo安装
pip install py2neo
3.2 py2neo连接neo4j
frompy2neoimportGraph
def__init__(self):
# 建立连接
link = Graph("http://localhost:7474", username="neo4j", password="***")
self.graph=link
3.3 清空数据库结点与边
注意:此时会发现Property Keys未删除,要想删除只有找到你的数据库data/graph.db里面全部删除掉才可以。
3.4 py2neo创建结点
创建结点时会发现label需要传参,那么label到底是什么呢?
在neo4j中不存在表的概念,可以把label当作表,相当于在创建多个结点时,指定其为同一label,就类似于为这几个结点(关系型数据库中类似与字段)储存到一张表中。
为了更好的描述疾病、药物等的构建,参考以下ER图进行构建!
frompy2neoimportNode
defcreate_node(self):
# 疾病、临床表现、药物等结点定义
foreach_disindis_list:
dis_node=Node(dis_label,name=each_dis)
self.graph.create(dis_node)
foreach_cliincli_list:
cli_node = Node(cli_label, name=each_cli)
self.graph.create(cli_node)
foreach_sdefindrug_list:
drug_node = Node(dru_label, name=each_sdef)
self.graph.create(drug_node)
foreach_sdefinsdef_list:
sdef_node=Node(side_effect_label,name=each_sdef)
self.graph.create(sdef_node)
foreach_zdinzd_method_list:
zd_node=Node(diagnostic_label,name=each_zd)
self.graph.create(zd_node)
3.5 py2neo创建关系
一个难点:取结点操作
结点关系方法封装
frompy2neoimportRelationship
defcreate_Rel(self):
"""
建立关系
高血压疾病与临床表现之间的双向关系定义
:return:
"""
# 获取高血压与糖尿病结点,然后通过循环,建立这两个疾病与临床表现的关系
hyp_node = self.graph.find_one(
label=dis_label,
property_key="name",
property_value="高血压"
)
tnb_node = self.graph.find_one(
label=dis_label,
property_key="name",
property_value="糖尿病"
)
# 建立疾病与临床表现的关系
forcli_nameincli_list:
cli_node = self.graph.find_one(
label=cli_label,
property_key="name",
property_value=cli_name
)
hyp_to_cli = Relationship(hyp_node,'产生', cli_node)
self.graph.create(hyp_to_cli)
tnb_to_cli = Relationship(tnb_node,'产生', cli_node)
self.graph.create(tnb_to_cli)
# 建立疾病与诊断方法之间的关系
fordiag_nameinzd_method_list:
diag_node = self.graph.find_one(
label=diagnostic_label,
property_key="name",
property_value=diag_name
)
ifdiag_name=="血糖"anddiag_name=="血脂"anddiag_name=="胆固醇":
diag_to_dis = Relationship(diag_node,'辅助检查', tnb_node)
else:
diag_to_dis = Relationship(diag_node,'辅助检查', hyp_node)
self.graph.create(diag_to_dis)
# 建立疾病与药物关系
fordrug_nameindrug_list:
drug_node = self.graph.find_one(
label=dru_label,
property_key="name",
property_value=drug_name
)
ifdrug_name=="胰岛素"ordrug_name=="胰高血糖素":
drug_to_disease=Relationship(drug_node,'治疗',tnb_node)
else:
drug_to_disease= Relationship(drug_node,'治疗', hyp_node)
self.graph.create(drug_to_disease)
# 建立药物与副作用之间的关系
fordrug_nameindrug_list:
drug_node = self.graph.find_one(
label=dru_label,
property_key="name",
property_value=drug_name
)
forsdef_nameinsdef_list:
sdef_node = self.graph.find_one(
label=side_effect_label,
property_key="name",
property_value=sdef_name
)
ifdrug_name =="利尿药"andsdef_name =="尿酸升高":
drug_to_sdef = Relationship(drug_node,'引发', sdef_node)
self.graph.create(drug_to_sdef)
elifdrug_name =="钙拮抗药"andsdef_name =="血钾降低":
drug_to_sdef = Relationship(drug_node,'引发', sdef_node)
self.graph.create(drug_to_sdef)
elifdrug_name =="胰岛素"and(sdef_name =="恶心"orsdef_name =="呕吐"):
drug_to_sdef = Relationship(drug_node,'引发', sdef_node)
self.graph.create(drug_to_sdef)
elifdrug_name =="胰高血糖素"and(sdef_name =="头晕"orsdef_name =="眼花"):
drug_to_sdef = Relationship(drug_node,'引发', sdef_node)
self.graph.create(drug_to_sdef)
3.6 调用
上述代码全部封装在createBHPData类中,需要实例化对象,然后调用相应方法。
c=createBHPData()
c.clean_node()
c.create_node()
c.create_Rel()
最后,刷新浏览器版neo4j,然后就可以看到自己的图了。
4.作者的话
洞察 腾讯核心技术
剖析业界实践案例