前言
一、安装eno4j图数据库
二、启动neo4j
三、Python连接eno4j
????????3.1、安装py2neo
? ? ? ? 3.2、使用py2neo操作neo4j
四、数据入库
? ? ? ? 4.1、抽取三元组关系
????????4.2、效果展示
? ? ? ? 4.3、删除图库中所有实体和关系
五、合并相同实体
前言
????????本文对非结构化文本数据进行解析成三元组,后写入neo4j图库。记录一些操作代码。在实际项目实战肯定是一体化流程。例如输入一个word文档,需要你对里面的内容进行解析,提取相应的三元组关系,录入图库,可视化展示。完整的项目可视化展示下图所示。但本文记录的主要是录入图库的操作,本文以通俗易懂的脚步出发记录。
一、安装eno4j图数据库
? ? ? ? 官网下载地址:Neo4j Desktop Download | Free Graph Database Download
二、启动neo4j
????????1)解压安装包到电脑任意盘中
????????2)进入文件中的bin目录
????????3)cmd模式打卡当前文件夹,输入eno4j.bat console
? ? ? ? 4)web服务端使用?http://localhost:7474/?打开
三、Python连接eno4j
????????3.1、安装py2neo
pip install py2neo
? ? ? ? 3.2、使用py2neo操作neo4j
from py2neo import Graph, Node, Relationship,NodeMatcher
# 连接图库 初始化账号密码都是neo4j
graph = Graph('http://localhost:7474', auth=('neo4j', 'neo4j'))
# 注意使用Python连接neo4j时要首先启动neo4j的服务,否则Python会抛出异常。
四、数据入库
? ? ? ? 4.1、抽取三元组关系
? ? ? ? ? ? ? ? 三元组指的就是类似于<头实体,关系、尾实体>的数据集合
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)
# 文中相当于这样一个三元组 <邯郸市,属于,河北省>。当然现实场景头尾实体和关系不是自己指定的,需要进行挖掘的。这里就是举个例子理解下。
????????4.2、效果展示
? ? ? ? 4.3、删除图库中所有实体和关系
? ? ? ? ? ? ? ? 当图中节点关系复杂、混乱时,选择使用整体删除的方案。代码如下:
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效果展示:
|