赞
踩
本文对非结构化文本数据进行解析成三元组,后写入neo4j图库。记录一些操作代码。在实际项目实战肯定是一体化流程。例如输入一个word文档,需要你对里面的内容进行解析,提取相应的三元组关系,录入图库,可视化展示。完整的项目可视化展示下图所示。但本文记录的主要是录入图库的操作,本文以通俗易懂的脚步出发记录。
官网下载地址:Neo4j Desktop Download | Free Graph Database Download
1)解压安装包到电脑任意盘中
2)进入文件中的bin目录
3)cmd模式打卡当前文件夹,输入eno4j.bat console
4)web服务端使用 http://localhost:7474/ 打开
pip install py2neo
- from py2neo import Graph, Node, Relationship,NodeMatcher
-
-
- # 连接图库 初始化账号密码都是neo4j
- graph = Graph('http://localhost:7474', auth=('neo4j', 'neo4j'))
-
-
- # 注意使用Python连接neo4j时要首先启动neo4j的服务,否则Python会抛出异常。
-
三元组指的就是类似于<头实体,关系、尾实体>的数据集合
- from py2neo import Graph, Node, Relationship,NodeMatcher
-
- # 头实体
- head = Node("regoin", name='邯郸市')
- # 尾实体
- tail = Node("regoin", name='河北省')
- # 头尾实体关系
- entity = Relationship(head,"属于", tail)
- # 创建实例
- graph.create(entity)
-
-
-
- # 头实体
- head = Node("regoin", name='丛台区')
- # 尾实体
- tail = Node("regoin", name='河北省')
- # 头尾实体关系
- entity = Relationship(head,"属于", tail)
- # 创建实例
- graph.create(entity)
-
-
- # 文中相当于这样一个三元组 <邯郸市,属于,河北省>。当然现实场景头尾实体和关系不是自己指定的,需要进行挖掘的。这里就是举个例子理解下。
-
当图中节点关系复杂、混乱时,选择使用整体删除的方案。代码如下:
- def del_all_graph(graph):
- #删除节点
- # 图中所有节点及关系都删除
- y = input("请确认是否要删除图库中所有节点及关系(y/n):")
- if y == 'y':
- graph.delete_all()
- print("已确认删除图库所有节点和关系\n")
- elif y == 'n':
- print("已确认不删除图库所有节点和关系\n")
- pass
- else:
- print("=========请输入正确的提示引导=========\n")
- del_all_graph(graph)
-
-
-
-
- if __name__ == '__main__':
- # 连接图库
- graph = Graph('http://localhost:7474', auth=('neo4j', '123456789'))
- # 确认是否删除图库所有节点
- del_all_graph(graph)
-
-
目前建立的图关系是两两之间的关系。列如:邯郸属于河北,丛台区属于邯郸。在图中会分成独立的两块,我们的目的是想要合成 邯郸和丛台区都属于河北的关系。使用如下代码就可以在已存在的实例中派生出新的关系,列如一对多的关系。
- from py2neo import Graph, Node, Relationship,NodeMatcher
-
- # 这里图库中已经存在邯郸市属于河北省,现在需要添加一个丛台区属于河北省这样的一个关系
-
-
- # 头实体
- head = Node("regoin", name='丛台区')
- # 尾实体
- tail = Node("regoin", name='河北省')
-
-
- # 匹配查找图库中节点
- matcher = NodeMatcher(graph)
- nodelist = list(matcher.match("regoin",name='河北省'))
- if len(nodelist) > 0:
- # 表示节点存在,不需创建新的节点
- already_header = nodelist[0]
- # 可以直接添加关系
- entity = Relationship(head, "属于", already_header)
- graph.create(entity)
- else:
- # 表示图库中没有存在当前要写入的节点
- entity = Relationship(head, "属于", tail)
- # 创建关系
- graph.create(entity)
对比4.2效果展示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。