ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

新手向:Neo4j图数据库与人物关系三元组的使用

新手向:Neo4j图数据库与人物关系三元组的使用 大家好我最近研究的方向大多是知识图谱部分组员可能会使用到这些项目这是 GitHub 上一个开源大佬提供的项目里面的一些数据大家看看。我们首先要知道什么是人物关系三元组以及它的作用:人物关系三元组是构建知识图谱的核心数据结构格式为**人物A人物B关系阵营A阵营B**。例如郭靖,黄蓉,夫妻,丐帮,丐帮。其作用体现在1. **结构化数据**将非结构化的文本如小说/剧本转化为机器可处理的标准化关系链明确角色间的关联属性2. **可视化基础**为D3.js等工具提供节点(node)与连接线(link)的绘制依据人物作为节点关系作为连接线属性3. **阵营划分**通过第四、第五字段实现角色分组在力导向图中自动聚类显示如武林门派、家族势力4. **关系去重**确保单向关系表达如已定义张无忌-赵敏:倾慕则不再重复定义逆向关系5. **数据校验**通过校验层过滤无效节点如未定义的人物ID保证图谱数据的完整性和渲染稳定性这种三元组结构如同建筑图纸决定了知识图谱的拓扑结构、交互逻辑和视觉呈现效果。我们在代码中如何呢:首先是要构建一个人物关系三元组数据集,我们以红楼梦为例可以看到,其格式为人物A人物B关系阵营A阵营B,符合要求接下来,启动和连接Neo4j社区版,这段代码主要用于连接Neo4j图数据库并设置一些常量配置下面我将详细解释各个部分的作用from py2neo import Graph graph Graph(bolt://localhost:7687, auth(neo4j, 12345678)) CA_LIST {贾家荣国府:0,贾家宁国府:1,王家:2,史家:3,薛家:4,其他:5,林家:6} similar_words { 爸爸: 父亲, 妈妈: 母亲, 爸: 父亲, 妈: 母亲, 父亲: 父亲, 母亲: 母亲, 儿子:儿子, 女儿:女儿, 丫环:丫环, 兄弟:兄弟, 妻:妻, 老婆:妻, 哥哥:哥哥, 表妹:表兄妹, 弟弟:弟弟, 妾:妾, 养父:养父, 姐姐:姐姐, 娘:母亲, 爹:父亲, father:父亲, mother:母亲, 朋友:朋友, 爷爷:爷爷, 奶奶:奶奶, 孙子:孙子, 老公:丈夫, 岳母: 岳母, 表兄妹:表兄妹, 孙女: 孙女, 嫂子:嫂子, 暧昧:暧昧 }from py2neo import Graph graph Graph(bolt://localhost:7687, auth(neo4j, 12345678))from py2neo import Graph: 从py2neo库中导入Graph类。py2neo是一个Python库用于与Neo4j图数据库交互。graph Graph(...): 创建Graph对象建立与Neo4j数据库的连接。bolt://localhost:7687: 指定Neo4j数据库的连接地址和端口。Bolt是Neo4j的高性能二进制协议。auth(neo4j, 12345678): 提供认证信息用户名neo4j和密码12345678。CA_LIST {贾家荣国府:0,贾家宁国府:1,王家:2,史家:3,薛家:4,其他:5,林家:6}这是一个字典定义了《红楼梦》中主要家族的分类编码键家族/势力名称如贾家荣国府、王家等值对应的数字编码0-6用途在数据库中标记人物所属家族或进行家族相关的统计分析。similar_words { 爸爸: 父亲, 妈妈: 母亲, # ...其他映射... 暧昧:暧昧 }这是一个关系类型的同义词标准化字典将不同表达方式的亲属关系映射到标准名称例如爸爸、爹、father都会映射到标准名称父亲包含多种亲属关系父母子女、兄弟姐妹、夫妻、祖孙等也包含一些特殊关系如朋友、暧昧等用途在处理文本数据时将不同表述的关系统一为标准化名称便于后续分析和查询。这段代码主要完成了三件事建立与Neo4j数据库的连接为后续的图数据操作做准备定义了《红楼梦》中主要家族的分类体系这些配置在一个人物关系分析系统中使用用于存储和查询《红楼梦》中的人物及其关系网络。提供了关系类型的标准化映射用于统一不同表述的亲属关系接下来,启动neo4j将准备好的人物关系三元组存入一个TXT文件里面,命名为Hrelation.txt,为方便后续其他人物关系三人组的构建将它存入一个人物关系三元组文件夹里面(如raw_data):接下来进行数据库节点的连接与构建:A方案:如果想让节点可以显示图片可用下面这段代码,将图片上传到本地Python服务器里面.再传给neo4j使其能够构建图片节点from py2neo import Graph from config import graph BASE_IMAGE_URL http://localhost:8000 # 本地图片服务器地址 with open(../raw_data/Hrelation.txt, encodingutf-8) as f: for line in f.readlines(): rela_array line.strip(\n).split(,) print(rela_array) # 生成图片 URL image_url_1 f{BASE_IMAGE_URL}/{rela_array[0]}.png image_url_2 f{BASE_IMAGE_URL}/{rela_array[1]}.png # 创建或更新节点带图片 URL graph.run( MERGE (p:Person {Name: $name}) ON CREATE SET p.cate $cate, p.image_url $image_url ON MATCH SET p.image_url $image_url , namerela_array[0], caterela_array[3], image_urlimage_url_1 ) graph.run( MERGE (p:Person {Name: $name}) ON CREATE SET p.cate $cate, p.image_url $image_url ON MATCH SET p.image_url $image_url , namerela_array[1], caterela_array[4], image_urlimage_url_2 ) # 创建关系 graph.run( MATCH (a:Person {Name: $name1}), (b:Person {Name: $name2}) MERGE (a)-[r:RELATION {relation: $relation}]-(b) , name1rela_array[0], name2rela_array[1], relationrela_array[2] )接下来我将详细介绍每一个地方是干什么的:from py2neo import Graph from config import graph BASE_IMAGE_URL http://localhost:8000 # 本地图片服务器地址from py2neo import Graph: 导入py2neo库的Graph类用于与Neo4j交互from config import graph: 从config模块导入已配置好的graph对象包含数据库连接信息BASE_IMAGE_URL: 定义本地图片服务器的基础URL用于构建人物头像的完整URLwith open(../raw_data/Hrelation.txt, encodingutf-8) as f: for line in f.readlines(): rela_array line.strip(\n).split(,) print(rela_array)打开../raw_data/Hrelation.txt文件包含《红楼梦》人物关系数据逐行读取文件内容每行去除换行符后按逗号分割成数组rela_array打印当前处理的行内容用于调试# 生成图片 URL image_url_1 f{BASE_IMAGE_URL}/{rela_array[0]}.png image_url_2 f{BASE_IMAGE_URL}/{rela_array[1]}.png # 创建或更新节点带图片 URL graph.run( MERGE (p:Person {Name: $name}) ON CREATE SET p.cate $cate, p.image_url $image_url ON MATCH SET p.image_url $image_url , namerela_array[0], caterela_array[3], image_urlimage_url_1 )图片URL生成:为两个人物的头像构造完整URL假设图片以人物名.png格式存储MERGE操作:MERGE确保节点存在不存在则创建Person是节点标签Name是主属性用于唯一标识人物ON CREATE SET只在创建时设置cate(类别)和image_url属性ON MATCH SET在节点已存在时更新image_url属性# 创建关系 graph.run( MATCH (a:Person {Name: $name1}), (b:Person {Name: $name2}) MERGE (a)-[r:RELATION {relation: $relation}]-(b) , name1rela_array[0], name2rela_array[1], relationrela_array[2] )MATCH查找两个已存在的人物节点MERGE确保两者之间存在RELATION类型的关系关系带有relation属性存储具体关系描述如父亲、妻子等这段代码的主要功能是从文本文件读取《红楼梦》人物关系数据在Neo4j中创建或更新人物节点包含名称、类别和头像URL最终构建出一个包含人物信息、所属家族和相互关系的知识图谱可用于人物关系查询、可视化展示等应用场景。在相关人物之间建立关系带有关系类型属性B直接构建文字节点不使用图片,可节省大量脑力,代码段也比较简单:from py2neo import Graph, Node, Relationship, NodeMatcher from Xconfig import graph with open(../raw_data/Hrelation.txt, encodingutf-8) as f: for line in f.readlines(): relation_array line.strip(\n).split(,) print(relation_array) graph.run(MERGE(p: Person{cate:%s,Name: %s}) % (relation_array[3],relation_array[0])) graph.run(MERGE(p: Person{cate:%s,Name: %s}) % (relation_array[4], relation_array[1])) graph.run( MATCH(e: Person), (cc: Person) \ WHERE e.Name%s AND cc.Name%s\ CREATE(e)-[r:%s{relation: %s}]-(cc)\ RETURN r % (relation_array[0], relation_array[1], relation_array[2],relation_array[2]) )这段代码是用于将关系数据从文本文件导入Neo4j图数据库的Python脚本主要功能是创建人物节点和建立他们之间的关系。下面我会详细分解每个部分的功能:from py2neo import Graph, Node, Relationship, NodeMatcher from Xconfig import graph导入的库Graph: Neo4j数据库连接接口Node: 表示图数据库中的节点Relationship: 表示节点之间的关系NodeMatcher: 用于查询节点的工具from Xconfig import graph: 从自定义配置文件导入已配置好的数据库连接对象with open(../raw_data/Xrelation.txt, encodingutf-8) as f: for line in f.readlines(): relation_array line.strip(\n).split(,) print(relation_array)打开../raw_data/Hrelation.txt文件(UTF-8编码)逐行读取文件内容每行处理流程去除行尾换行符(strip(\n))按逗号分割成数组(split(,))打印当前行内容(用于调试)graph.run(MERGE(p: Person{cate:%s,Name: %s}) % (relation_array[3],relation_array[0])) graph.run(MERGE(p: Person{cate:%s,Name: %s}) % (relation_array[4], relation_array[1]))graph.run(MERGE(p: Person{cate:%s,Name: %s}) % (relation_array[4], relation_array[1]))MERGE操作创建或匹配已有节点节点结构标签Person属性cate: 人物类别(来自relation_array[3]和[4])Name: 人物名称(来自relation_array[0]和[1])分别为关系中的两个人物创建节点graph.run( MATCH(e: Person), (cc: Person) \ WHERE e.Name%s AND cc.Name%s\ CREATE(e)-[r:%s{relation: %s}]-(cc)\ RETURN r % (relation_array[0], relation_array[1], relation_array[2],relation_array[2]) )MATCH查找两个已存在的人物节点CREATE创建从第一个节点到第二个节点的关系关系结构类型动态使用relation_array[2]的值属性relation值同样来自relation_array[2]RETURN r返回创建的关系对象(主要用于确认操作成功)这段代码的主要功能是从文本文件读取关系数据在Neo4j中创建或匹配人物节点(带类别属性)最终构建出一个包含人物节点和他们之间关系的知识图谱适用于社交网络分析、关系可视化等场景在指定人物间创建带有类型的关系在连接到数据库的情况下运行A代码或者B代码,将会弹出以下效果:我们这是打开数据库可以看到节点已经构建成功:
返回列表