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')
node_list_key, node_list_value = data_extraction(data_player)
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)

这样一下,它们就分开,在一起总比分开难~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值