py4neo V4基操

連接到neo4j

from py2neo import  Graph
graph = Graph("http://localhost:7474", username="neo4j", password="123456")
#localhost可爲啓動了neo4j服務的服務器地址

建立節點

from py2neo import Node
skill = 'skill'
name = '如來神掌'
attack = '100000'
power = 1000
lossmg = 15
name_node = Node(skill,name=name,attack=attack,power=power,lossmg=lossmg)
graph.create(name_node)

一個節點的數據形式是 {id:label {attri1:1,attri2:2}}這樣的;其中label可以理解爲sql類的數據庫中的表名,id是這個節點的id,後面的字典就是這個節點的屬性。
Node中第一個skill爲label,一個後面的name等是屬性的賦值操作;create將該節點在graph中創建,這樣它纔是一個有靈魂的節點。
注意 屬性名稱裏最好不要包含名爲attri的屬性,會報一個錯誤,似乎是和內部的一個參數名同名了。

將excel中的數據導入neo4j中,每一行數據作爲一個節點:

from py2neo import Node
import tqdm
import pandas as pd

class ExcelToNeo4j(object):
    """將excel中數據存入neo4j"""

    def __init__(self, delete=True):
        """建立連接,高清有碼"""
        self.graph = Graph("http://111.229.***.138:7474", username="neo4j", password="****")
        if delete:
            self.graph.delete_all()

    def NodeType(self, lable_name, attri):
        """拼接Node執行字符串"""
        node = "name_node = Node(" + lable_name + ","
        for at in attri:
            node += at + "=" + at + ","
        node = node[:-1]+")"
        return node
    

    def create_node(self, lable_name, node_list_key, attri):
        """建立節點
           node_list_key: [[attri1,attri2,...],[]]
           attri: 屬性名稱list
        """
        # print('attri:',attri) #屬性值裏面的key名稱不要出現attri,會和原始參數衝突
        locals()[lable_name] = lable_name
        with tqdm(total=len(node_list_key)) as pbar:
            for attri_list in node_list_key:
                #name_node = Node(lable_name, name=name)
                for key,value in list(zip(attri,attri_list)):
                    locals()[key] = value  
                loc = locals()
                print(self.NodeType(lable_name, attri))
                exec(self.NodeType(lable_name, attri))
                name_node = loc['name_node']
                self.graph.create(name_node)
                pbar.update(1)
        pbar.close()
        print("create node end")


def data_extraction(data):
    """節點數據抽取"""

    # 取出code到list
    node_list_key = []
    for i in range(0, len(data)):
        node_list_key.append(data[data.columns[0]][i])

    # value抽出作屬性
    node_list_value = []
    for i in range(0, len(data)):
        node_list_value.append([])
        for n in range(0, len(data.columns)):
            # 取出表頭名稱data.columns[i]
            node_list_value[i].append(data[data.columns[n]][i])
    # 將list中浮點及整數類型全部轉成string類型
    node_list_value = [[str(i) for i in item] for item in node_list_value]

    return node_list_key, node_list_value
  
data_player = pd.read_excel('./player.xlsx', header=0, encoding='utf8')
create_data = DataToNeo4j()
create_data.create_node('player', node_list_value,data_player.columns)

attri_value:[[value11,value12,…],[value21,value22,…]]這樣一個列表,元素代表一行數據對應的屬性值。
attri:[attri1,attri2,…],包括各個屬性的名稱,pandas的DataFrame直接取columns就行。
NodeType用來拼接出
“name_node = Node(skill,name=name,attack=attack,power=power,lossmg=lossmg)”這樣一串字符串,用locals()創建了與字符串同樣的變量名並且賦值,注意loc = locals()和name_node = loc[‘name_node’]是必要的,不然name_node這個變量不會被下面的語句識別。
這樣就可以適應各種屬性名稱,不用手動打上去了~不知道有沒有其他官方一點的做法,求教了!

建立關係

from py2neo import Node, Graph, Relationship
graph = Graph("http://localhost:7474", username="neo4j", password="123456")
node1 = Node('skill',name='如來神掌',attack=100000,power=100,lossmg=15)
node2 = Node('people',name='阿星',hp=100000,mg=100)
graph.create(node1)
graph.create(node2)
properties = {'國籍':'中國','屬性':'佛性'}
rel = Relationship(node1,'歸屬', node2,**properties)
graph.create(rel)

這樣就建立了技能表’skill’裏的’如來神掌’節點歸屬到人物表’people’裏的阿星的關係了;這裏面有個參數properties是表示這個關係的屬性,要寫成字典的形式,和節點的屬性差不多意思。

有合就有離,怎麼把如來神掌搶到自己的節點上

graph.separate(rel)

這樣一下,它們就分開,在一起總比分開難~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章