当前位置:   article > 正文

知识图谱-用python操纵neo4j数据库-以高速收费站记录为例_datatoneo4jclass

datatoneo4jclass

1.数据

首先我们来看看数据是什么样子的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2YXTfOu6-1606010302102)

这个数据实际上能做很多事情,但是本文主要重点主要是弄懂如何用python来建立neo4j数据库中的结点和关系,以后换了场景只需要在本文代码上结合neo4j官方文档进行修改即可。

2.环境

python3.8
neo4j.4.1.3

所需库:
pip install py2no #注意版本不要太低
pip install pandas

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.链接模块编写(模块名称:DataToNeo4jClass)

本文将必要的注释都写在了代码段中,所以这里直接给出代码

# _*_ coding: utf-8 _*_

from py2neo import Node, Graph, Relationship, NodeMatcher


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

    def __init__(self):
        """建立连接"""
        link = Graph("http://localhost:7474", username="neo4j", password="admin")#改成你自己的用户名和密码
        self.graph = link
        # self.graph = NodeMatcher(link)
        # 定义label
        self.buy = 'buy'
        self.sell = 'sell'
        self.graph.delete_all()
        self.matcher = NodeMatcher(link)

        """
        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)    
        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)

  • 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

4.数据提取与结点创立(类名称:invoice_neo4j)

# _*_ coding: utf-8 _*_

from dataToneo4jClass.DataToNeo4jClass import DataToNeo4j

import os
import pandas as pd

#pip install py2no ==5.0b1 注意版本不低于此版本

invoice_data=pd.read_excel('./Invoice_data_Demo.xls', header=0)

#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])

    #去除重复的发票名称
    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.colums[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())

  • 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
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

强调一下:上面两个代码段,需要将两个文件放在一起,一点一点看懂,虽然有些花时间吗,但是收获不会少,遇到不懂的百度,并创建一个test文件,将不懂的点的demo复制到test文件中运行一下,多打印一些东西,分析下结果就全明白了。

5.结果展示

首先打开cmd执行以下代码将neo4j的服务开起来

 neo4j.bat console
  • 1

然后运行invoice_neo4j类

然后浏览器访问http://localhost:7474 得到如下结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJLDJx9C-1606010302104)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pHJYnLIc-1606010302105)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YLpSFdA8-1606010302106)

6.写在后面

感谢教程:
    知识图谱实战系列(python版),本文在教程代码上进行修改并添加了更多的注释。
本人将项目代码放在了百度网盘:
    链接:https://pan.baidu.com/s/1PibmNxtn9JXT4SVOF4sJ_Q 
    提取码:ghsy 
欢迎一起交流学习:
本人QQ:1518887260
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

整理于2020年10月31日

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

闽ICP备14008679号