连接到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)
这样一下,它们就分开,在一起总比分开难~