【学习笔记】pandas提取excel数据形成三元组,采用neo4j数据库构建小型知识图谱

前言

    代码来自github项目 neo4j-python-pandas-py2neo-v3,项目作者为Skyelbin。我记录一下运行该项目的一些过程文字以及遇到的问题和解决办法。

一、提取excel中的数据转换为DataFrame三元组格式

from dataToNeo4jClass.DataToNeo4jClass import DataToNeo4j
import os
import pandas as pd


# 提取excel表格中数据,将其转换成dateframe类型,dateframe相当于表格
# os.chdir('xxxx') 这块我注释掉了,没有什么用还报错

invoice_data = pd.read_excel('./Invoice_data_Demo.xls', header=0)  # 用excel中的第一行作为表头
print(invoice_data)

def data_extraction():
    """节点数据抽取"""

    # 取出发票名称到list
    node_list_key = []
    for i in range(0, len(invoice_data)):  # len(invoice_data)是表格包含的数据总行数,表头一行不算入
        node_list_key.append(invoice_data['发票名称'][i])

    # 去除重复的发票名称
    node_list_key = list(set(node_list_key))

    # value抽出作node
    node_list_value = []
    for i in range(0, len(invoice_data)):
        for n in range(1, len(invoice_data.columns)):    # invoice_data.columns 返回所有列标签组成的列表
            # 取出表头名称invoice_data.columns[n]
            node_list_value.append(invoice_data[invoice_data.columns[n]][i])  # node_list_value存储除了发票名称外的所有行
    # 去重
    node_list_value = list(set(node_list_value))
    # 将list中浮点及整数类型全部转成string类型
    node_list_value = [str(i) for i in node_list_value]

    return node_list_key, node_list_value


def relation_extraction():
    """关系数据抽取"""

    links_dict = {}
    name_list = []
    relation_list = []
    name2_list = []

    for i in range(0, len(invoice_data)):
        m = 0
        name_node = invoice_data[invoice_data.columns[m]][i]  #依次取第一列的发片名称值
        # 将发票相关的26个属性值存储起来
        while m < len(invoice_data.columns)-1:
            relation_list.append(invoice_data.columns[m+1])
            name2_list.append(invoice_data[invoice_data.columns[m+1]][i])
            name_list.append(name_node)
            m += 1

    # 将数据中int类型全部转成string
    name_list = [str(i) for i in name_list]
    name2_list = [str(i) for i in name2_list]

    # 整合数据,将三个list整合成一个dict,类似三元组形式
    links_dict['name'] = name_list
    links_dict['relation'] = relation_list
    links_dict['name2'] = name2_list
    # 将数据转成DataFrame
    df_data = pd.DataFrame(links_dict)
    return df_data


# 实例化对象
data_extraction()
relation_extraction()
create_data = DataToNeo4j()

create_data.create_node(data_extraction()[0], data_extraction()[1])  # 获取 node_list_key 和 node_list_value
create_data.create_relation(relation_extraction())

invoice_data 如下:
在这里插入图片描述
node_list_key 如下:
在这里插入图片描述
node_list_value 如下:
在这里插入图片描述
df_data 如下:
在这里插入图片描述

二、利用三元组在neo4j中构建节点和关系,形成可视化知识图谱

from py2neo import Node, Graph, Relationship

class DataToNeo4j(object):
    """将excel中数据存入neo4j"""

    def __init__(self):
        """Graph实例化,建立数据库连接"""
        link = Graph("http://localhost:7474", username="neo4j", password="neo4j")  # 填写neo4j数据库账户和密码,默认都是neo4j
        self.graph = link
        # 定义label
        self.invoice_name = '发票名称'
        self.invoice_value = '发票值'
        self.graph.delete_all()    # 删除所有图

    def create_node(self, node_list_key, node_list_value):
        """建立节点"""
        for name in node_list_key:
            name_node = Node(self.invoice_name, name=name)    # 定义节点
            self.graph.create(name_node)
        for name in node_list_value:
            value_node = Node(self.invoice_value, name=name)
            self.graph.create(value_node)

    def create_relation(self, df_data):
        """建立联系"""

        m = 0
        for m in range(0, len(df_data)):
            try:
                rel = Relationship(self.graph.find_one(label=self.invoice_name, property_key='name', property_value=df_data['name'][m]),
                                   df_data['relation'][m], self.graph.find_one(label=self.invoice_value, property_key='name',
                                   property_value=df_data['name2'][m]))
                self.graph.create(rel)  # 创建35个关系
            except AttributeError as e:
                print(e, m)

构建的知识图谱如下所示:
在这里插入图片描述
压缩包里其他文件说明(个人理解):

  • jieba_code 文件夹:是实现 jieba 分词的,要用到 mysql 数据库;
  • neo4j_matrix.py:将知识图谱转化为矩阵,为其他算法做数据基础;
  • neo4j_to_dataframe.py:在知识图谱中查询节点,利用基本的Cypher语句实现。

因为我只需要学习构建知识图谱,所以其他的内容并未运行,想要简单了解的小伙伴可以跑起来试试~

总结

基于存储在excel中的半结构化数据构建知识图谱的大致流程:将excel中的数据转换为dataframe格式的数据,此处需要注意excel中每行数据都要转化为多个三元组,此时已经获取三元组数据了,然后在neo4j中构建节点和关系就建立起基本的知识图谱啦~


版权说明
博文作者:早知晓
博文链接:Click here
转载请注明出处,谢谢合作~

祝大家都走在前进的路上,一路鲜花掌声。


  • 8
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
Python是一种常用的编程语言,而pandas是一种基于Python的数据处理库。它们的组合可以方便地从Excel文件中抽取数据,并将其转换为三元组形式被加载到Neo4j数据库中,用于构建相关的知识图谱。 首先,我们需要使用pandas库来读取Excel文件。通过使用pandas的read_excel()函数,我们可以轻松地将Excel中的数据加载到Python中。 读取后的Excel数据可以使用pandas库进行处理,以便将其转换为三元组的形式。三元组由主体(subject)、谓词(predicate)和宾语(object)组成,它们之间通过关系连接起来。 在处理数据的过程中,我们可以使用pandas库提供的各种功能进行数据清洗、筛选和转换,以确保数据的质量和准确性。例如,我们可以使用pandas的dropna()函数去除含有缺失值的行,使用rename()函数重命名列名,以及使用apply()函数对数据进行自定义的转换操作。 接下来,我们可以使用Neo4j的Python驱动程序(如py2neo)来连接到Neo4j数据库,并使用Cypher查询语言来构建知识图谱。通过使用Cypher的CREATE语句,我们可以将转换后的三元组插入到Neo4j数据库中。 在将数据加载到Neo4j数据库时,我们可以根据数据之间的关系建立节点和关系。例如,我们可以根据三元组的关系将主体和宾语作为节点,谓词作为关系。 最后,我们可以使用Neo4j数据库提供的可视化工具(如Neo4j Browser或Neo4j Bloom)来浏览和查询构建好的知识图谱。这样,我们就可以通过Python和pandasExcel中的数据转换为三元组,并加载到Neo4j数据库中,从而构建相关的知识图谱

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早知晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值