py2neo操作图数据库——知识图谱实战-2

py2neo操作图数据库

连接数据库

#导入py2neo
from py2neo import Node, Graph, Relationship,NodeMatcher

#连接数据库
link = Graph("http://localhost:7474", auth=("neo4j", "neo4j"))#在高版本Graph不支持username参数,也创建了图

创建节点和关系

简易练习

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)

简单例子

from py2neo import Node, Graph, Relationship,NodeMatcher
#过程:1、创建图 2、创建节点 3、建立关系 4、查找

class DataToNeo4j(object):
    """将excel中数据存入neo4j"""

    def __init__(self):
        """建立连接"""
        # link = Graph("http://localhost:7474", username="neo4j", password="wangmeng")#老版本neo4j用这个调用
        link = Graph("http://localhost:7474", auth=("neo4j", "1999623Xt"))#在高版本Graph不支持username参数,也创建了图
        self.graph = link
        #self.graph = NodeMatcher(link)
        # 定义label
        self.buy = 'buy'
        self.sell = 'sell'
        self.graph.delete_all()#之前做的所有内容先删掉
        self.matcher = NodeMatcher(link)

    def create_node(self, node_buy_key,node_sell_key):
        """建立节点"""
        for name in node_buy_key:
            buy_node = Node(self.buy, name=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] + "'")))#打印关系里面的buy和sell节点,.where是匹配条件
                print(list(self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'")))#这样写是为了匹配dataframe里面的字符串
                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)

从excel读取数据并创建数据库

数据

1

创建节点

test_data = pd.read_excel('test_data_Demo.xls', header=0)

def data_extraction():
    """节点数据抽取"""

    # 取出甲方名称到list
    node_buy_key = []
    for i in range(0, len(test_data)):
        node_buy_key.append(test_data['甲方名称'][i])
    # 取出乙方名称到list
    node_sell_key = []
    for i in range(0, len(test_data)):
        node_sell_key.append(test_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(test_data)):
        for n in range(1, len(test_data.columns)):
            node_list_value.append(test_data[test_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(test_data)):#遍历数据,采集下面三个数据
        money_list.append(test_data[test_data.columns[2]][i])#交易金额
        sell_list.append(test_data[test_data.columns[1]][i])#乙方方名称
        buy_list.append(test_data[test_data.columns[0]][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)#练习题中34个元素
    return df_data

完整的代码

from py2neo import Node, Graph, Relationship,NodeMatcher
#过程:1、创建图 2、创建节点 3、建立关系 4、查找

class DataToNeo4j(object):
    """将excel中数据存入neo4j"""

    def __init__(self):
        """建立连接"""
        # link = Graph("http://localhost:7474", username="neo4j", password="wangmeng")#老版本neo4j用这个调用
        link = Graph("http://localhost:7474", auth=("neo4j", "neo4j"))#在高版本Graph不支持username参数,也创建了图
        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)#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] + "'")))#打印关系里面的buy和sell节点,.where是匹配条件
                print(list(self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'")))#这样写是为了匹配dataframe里面的字符串
                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)

if __name__ == "__main__":
    data=DataToNeo4j()
    data.create_node()
    data.create_relation()
from build_node_relation import DataToNeo4j
import pandas as pd

test_data = pd.read_excel('test_data_Demo.xls', header=0)
#可以先阅读下文档介绍API应用:https://py2neo.org/v4/index.html

def data_extraction():
    """节点数据抽取"""

    # 取出甲方名称到list
    node_buy_key = []
    for i in range(0, len(test_data)):
        node_buy_key.append(test_data['甲方名称'][i])
    # 取出乙方名称到list
    node_sell_key = []
    for i in range(0, len(test_data)):
        node_sell_key.append(test_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(test_data)):
        for n in range(1, len(test_data.columns)):
            node_list_value.append(test_data[test_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(test_data)):#遍历数据,采集下面三个数据
        money_list.append(test_data[test_data.columns[2]][i])#交易金额
        sell_list.append(test_data[test_data.columns[1]][i])#乙方方名称
        buy_list.append(test_data[test_data.columns[0]][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)#练习题中34个元素
    return df_data

create_data = DataToNeo4j()#调用外部py的子函数,建立连接,把图数据库先建好
create_data.create_node(data_extraction()[0], data_extraction()[1])#建立买方,卖方结点。利用函数的第0个,第1个返回值
create_data.create_relation(relation_extraction())#建立关系,利用relation_extraction返回的dataframe

图数据建立

2

posted @ 2025-05-22 17:35  狐狸胡兔  阅读(44)  评论(0)    收藏  举报