前言

    代码来自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
转载请注明出处,谢谢合作~

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


Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐