暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

知识图谱之python对neo4j数据库的增删改查

DATA江湖 2022-03-07
1269

最近点滴:

1,换了个很骚气的键盘(不能丢份呀~);

2,颈椎问题不大,注意姿势以及经常打羽毛球或游泳;

3,上周末医院补牙。

感想:

1,换键盘内在的原因更多的是“合群”。

2,随着年龄增长,各个零件需要修理和保养,才能更好地工作生活。

3,诊所建议带牙套,医院进行补牙处理;(诊所的目标是钱,医生的目标也许是患者数量,在保证质量的前提下,每个患者花费的精力尽量少)。


话不多说,上代码才是王道。


    # coding:utf-8
    from py2neo import Node, Relationship, Graph
    from py2neo.matching import *
    import json


    ##连接neo4j数据库,输入地址、用户名、密码
    neo4j_url = 'http://localhost:7474'
    auth = 'neo4j'
    password = '******'


    graph = Graph(neo4j_url, auth=auth, password=password)


    # 清空数据库
    graph.delete_all()


    #节点创建与关系创建的类
    class Create_data:
    def __init__(self,n_create,r_create):
    self.n_create = n_create
    self.r_create = r_create


    def create_node(self):
    for n in self.n_create:
    graph.create(n)


    def create_relationship(self):
    for r in self.r_create:
    graph.create(r)


    #python创建节点
    node_1 = Node(label='西游记', name='唐玄奘',past_life = '金蝉子')
    node_2 = Node(label='西游记', name='唐玄奘',past_life = '石猴')
    node_3 = Node(label='西游记', name='猪八戒',past_life = '天蓬元帅')
    node_list =[node_1, node_2, node_3]


    #python创建关系
    r_1_2 = Relationship(node_1, '徒弟', node_2)
    r_1_2['count'] = 1
    r_2_1 = Relationship(node_2, '师傅', node_1)
    r_2_1['count'] = 1
    r_1_3 = Relationship(node_1, '徒弟', node_3)
    r_1_3['count'] = 1
    r_list = [r_1_2,r_2_1,r_1_3]


    #调用类进行neo4j数据库的关系与节点的创建
    create_data=Create_data(n_create=node_list,r_create =r_list)
    create_data.create_node()
    create_data.create_relationship()


    #查询
    '''参考Cypher语言
    data_all = graph.run('MATCH(n) return n').data() # 所有数据
    r_all = graph.run('MATCH()-[r]->() RETURN r').data() # 读取
    print('查询:','\n','所有数据',data_all,type(data_all))
    print('查询:','\n','所有关系',r_all,type(r_all))


    '''


    #精确条件查询节点信息
    node_matcher = NodeMatcher(graph) #创建节点匹配器
    node_matcher_all = list(node_matcher.match()) #所有节点
    node_all_str = json.dumps(node_matcher_all, ensure_ascii = False) #json 转换,以便正常显示中文
    node_all = json.loads(node_all_str)
    for i,n in enumerate(node_all):
    print('节点匹配结果 %d' %i ,n)
    for i,n in enumerate(node_all):
    print('节点匹配结果的name属性 %d' %i ,n["name"])


    node_matcher_tang = list(node_matcher.match(label = '西游记', name = '唐玄奘')) #返回匹配成功,并且name为'唐玄奘'的节点列表
    node_tang_str = json.dumps(node_matcher_all, ensure_ascii = False) #json 转换,以便正常显示中文
    node_tang = json.loads(node_all_str)
    for i,n in enumerate(node_tang):
    print('节点为"唐玄奘" %d' %i ,n)


    '''
    条件查询
    node_matcher_all = list(node_matcher.match()) .where("_.name =~ '唐.*'")
    '''


    #查询关系信息
    r_matcher = RelationshipMatcher(graph)
    r_matcher_all = list(r_matcher.match()) #所有关系
    for i,r in enumerate(r_matcher_all):
    print('关系匹配结果 = %d' %i,r)


    r_tudi = list(r_matcher.match(r_type='徒弟')) #'徒弟'关系
    for i,r in enumerate(r_tudi):
    print('"徒弟"关系匹配结果 = %d' %i,r)




    #更新Node的某个属性值,若node没有该属性,则新增该属性。首先是查询是否有此节点,若无则新建,有则增加属性
    node_update_tang = node_matcher.match(label = '西游记', name = '唐玄奘').exists() # 节点是否匹配
    if node_update_tang == False:
    node_update_tang = Node(label = '西游记', name = '唐玄奘') #新建
    graph.create(node_update_tang)
    else:
    node_update_tang_list = list(node_matcher.match(label='西游记', name='唐玄奘'))
    for i in node_update_tang_list:
    i['add'] = 'yes_2' #增加与修改的区别在于key-['add']不同而已
    graph.push(i) #推送到neo4j,才生效
    '''
    多属性更新
    data = { 'name': 'Amy', 'past_life': 23 }
    node_1.update(data)
    graph.push(node_1)
    '''


    #更新关系的某个属性值,若关系没有该属性,则新增该属性。首先是查询是否有此关系,有则更新属性


    r_update_tudi = r_matcher.match(r_type='徒弟').exists() #匹配徒弟关系


    if r_update_tudi == True:
    r_update_tudi_list = list(r_matcher.match(r_type='徒弟'))
    print(r_update_tudi_list)
    for i in r_update_tudi_list:
    i['update'] = 'yes_2' #增加与修改的区别在于key-['add']不同而已
    graph.push(i) #推送到neo4j,才生效
    else:
    pass


    #删除一个节点和关系(删除name = '猪八戒'的节点以及与此节点有关系的所有节点和关系)
    b = list(node_matcher.match(name = '猪八戒'))[0]
    print(b)
    graph.delete(b)
    #删除关系(所有关系为徒弟都将被删除)
    graph.run('match ()-[r:徒弟]->() delete r;')

        

        上面代码实现了py对neo简单的增删改查。这里需要说明的是,py对数据进行更新后,执行 graph.push() 才能生效(推送到neo4j数据库)。发现用python操作neo4j更好的办法是操作Cypher(Cypher是描述性的图形查询语言,语法简单,功能强大)。

    下一篇是用纯Cyhper进行Neo4j的操作。

    文章转载自DATA江湖,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论