python操作neo4j


一、說在前面

1、使用工具:py2neo  ,官方操作文檔 :https://py2neo.org/v4/index.html

2、還包括一些neo4j的命令操作

二、案例說明

1、數據展示

 

 

 2、這個案例主要是讀取Excel中的結構化數據購買方、銷售方(節點)和金額(邊),並實現在圖中創建實體

 

 

 

三、相關代碼

1、DataToNeo4jClass.py(連接neo4j,創建節點和關系的工具)

# -*- 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="wzs208751")
        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)
View Code

2、invoice_neo4j.py

# -*- coding: utf-8 -*-
from utils.DataToNeo4jClass import DataToNeo4j
import os
import pandas as pd
#pip install py2neo==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.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())
View Code

四、Neo4j增刪改查命令

增:
增加一個節點
create (n:Person {name:'',age:31})
帶有關系屬性
create (p:Person{name:"",age:"31"})-[:包工程{金額:10000}]->(n:Person{name:"好大哥",age:"35"})
刪
create (n:Person {name:'TYD',age:31})
match (n:Person{name:"TYD"}) delete n
刪除關系
match (p:Person{name:"",age:"31"})-[f:包工程]->(n:Person{name:"好大哥",age:"35"})
 delete f
改:
加上標簽
match (t:Person) where id(t)=789 set t:好人return t
加上屬性
match (a:好人) where id(a)=789 set a.戰斗力=200 return a
修改屬性
match (a:好人) where id(a)=789 set a.戰斗力=500 return a
查:(查操作太多啦,直接參考neo4j例子就好)
match (p:Person) - [:包工程] -> (n:Person) return p,n

快速清空數據庫:
MATCH (n)
DETACH DELETE n

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM