【知识图谱系列】(实例)python操作neo4j构建企业间的业务往来的知识图谱

本章节通过聚焦于"金额"这一核心属性,构建了一幅知识图谱,旨在揭示"销售方"与"购买方"间的商业互动网。在这张图谱中,绿色节点象征着购买方,而红色节点则代表了销售方。这两类节点间的紧密连线,不仅映射了双方在市场活动中的合作桥梁,还特别以不同颜色编码的线条区分了交易的规模等级:细分为1000万级别、2000万级别、5000万级别乃至8000万级别的交易纽带,以此精准描绘出商业交易的多样性和规模层次。

目录

一、结果

二、数据

三、DataToNeo4jClass1.py

四、invoice_neo4j1.py 

一、结果

二、数据

三、DataToNeo4jClass1.py

# -*- coding: utf-8 -*-
from py2neo import Node, Graph, Relationship,NodeMatcher

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

    def __init__(self):
        """建立连接"""
        link = Graph("http://localhost:7474", auth=("neo4j", "123456789Xx"))
        self.graph = link
        #self.graph = NodeMatcher(link)
        # 定义label,定义标签
        self.buy = 'buy'#购买方
        self.sell = 'sell'#销售方
        self.graph.delete_all()#删除已有的节点和关系、清空
        self.matcher = NodeMatcher(link)#定义一个matcher,一会定义关系的时候要用
        #NodeMatcher是从py2neo中导入的    后续帮助做匹配

        #下边注释掉的是一些官方的小例子,做测试的时候可以试一试
        ##Node是从py2neo中导入的
        """
        #创建节点
        node3 = Node('animal' , name = 'cat')
        node4 = Node('animal' , name = 'dog')  
        node2 = Node('Person' , name = 'Alice')
        node1 = Node('Person' , name = 'Bob')  
        #创建关系、边
        r1 = Relationship(node2 , 'know' , node1)    
        r2 = Relationship(node1 , 'know' , node3) 
        r3 = Relationship(node2 , 'has' , node3) 
        r4 = Relationship(node4 , 'has' , node2) 
        #create就是实际的添加到图当中   
        self.graph.create(node1)
        self.graph.create(node2)
        self.graph.create(node3)
        self.graph.create(node4)
        self.graph.create(r1)
        self.graph.create(r2)
        self.graph.create(r3)
        self.graph.create(r4)
        """


    def create_node(self, node_buy_key,node_sell_key):
        """建立节点"""
        for name in node_buy_key:
            buy_node = Node(self.buy, name=name)#第一个参数是标签,第二个参数是名字
            self.graph.create(buy_node)
        for name in node_sell_key:
            sell_node = Node(self.sell, name=name)
            self.graph.create(sell_node)

    def create_relation(self, df_data):
        """建立联系"""      
        m = 0
        for m in range(0, len(df_data)):
            #遍历数据中的每一条数据
            try:    
                print(list(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'")))
                print(list(self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'")))
                rel = Relationship(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'").first(),
                                   df_data['money'][m], self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'").first())

                self.graph.create(rel)
            except AttributeError as e:
                print(e, m)

四、invoice_neo4j1.py 

# -*- coding: utf-8 -*-
from dataToNeo4jClass.DataToNeo4jClass1 import DataToNeo4j
import os
import pandas as pd
#pip install py2neo==5.0b1 注意版本,要不对应不了

invoice_data = pd.read_excel('./Invoice_data_Demo.xls', header=0, engine='xlrd')
#print(invoice_data)

#可以先阅读下文档:https://py2neo.org/v4/index.html

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

    # 取出购买方名称到list
    node_buy_key = []
    for i in range(0, len(invoice_data)):
        #遍历数据
        node_buy_key.append(invoice_data['购买方名称'][i])#里边有重复值
    
    node_sell_key = []
    for i in range(0, len(invoice_data)):
        node_sell_key.append(invoice_data['销售方名称'][i])#里边有重复值
        
    # 用set去除重复的发票名称
    node_buy_key = list(set(node_buy_key))
    node_sell_key = list(set(node_sell_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[i]
            node_list_value.append(invoice_data[invoice_data.columns[n]][i])
    # 去重
    node_list_value = list(set(node_list_value))
    # 将list中浮点及整数类型全部转成string类型
    node_list_value = [str(i) for i in node_list_value]

    return node_buy_key, node_sell_key,node_list_value


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

    links_dict = {}

    sell_list = []
    money_list = []
    buy_list = []

    for i in range(0, len(invoice_data)):
        #遍历数据
        money_list.append(invoice_data[invoice_data.columns[19]][i])#金额列
        sell_list.append(invoice_data[invoice_data.columns[10]][i])#销售方方名称列
        buy_list.append(invoice_data[invoice_data.columns[6]][i])#购买方名称列


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

    # 整合数据,将三个list整合成一个dict
    links_dict['buy'] = buy_list
    links_dict['money'] = money_list
    links_dict['sell'] = sell_list
    # 将数据转成DataFrame
    df_data = pd.DataFrame(links_dict)
    #print(df_data)
    return df_data

relation_extraction()
create_data = DataToNeo4j()

create_data.create_node(data_extraction()[0], data_extraction()[1])
create_data.create_relation(relation_extraction())

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值