当前位置:   article > 正文

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

from invoice_data.datatoneo4jclass.datatoneo4jclass import datatoneo4j

前言

    代码来自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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

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

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

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

总结

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


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

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


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/468257
推荐阅读
相关标签
  

闽ICP备14008679号