一、說在前面
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)
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())
四、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