当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    Python使用py2neo操作图数据库neo4j的方法详解(4)

    栏目:win服务器问题汇总 时间:2020-01-14 08:36

    通过graph.run().to_subgraph()方法将返回的结果转化为SubGraph对象,接着按之前操作SubGraph对象的方法取得节点对象,这里的节点对象Node可以直接按照之前的Node操作

    # 查询(p1)-[k]->(p2),并返回所有节点和关系
    gql = "MATCH (p1:Person)-[k:KNOWS]->(p2:Person) RETURN *"
    sub_graph = graph.run(gql).to_subgraph()
    # 获取子图中所有节点对象并打印
    nodes=sub_graph.nodes
    for node in nodes:
      print(node)
    # 输出的节点对象如下:
    '''
    (_101:Person {name: 'xiaozhang'})
    (_100:Person {name: 'xiaowang'})
    (_103:Person {name: 'xiaoli'})
    (_102:Person {name: 'xiaozhao'})
    '''
    
    

    3.5、OGM

    Object-Graph Mapping将图数据库中的节点映射为python对象,通过对象的方式对节点进行访问和操作。

    将图中的每种标签定义为一个python类,其继承自GraphObject,注意使用前先import。在定义时可以指定数据类的主键,并定义类的属性Property()、标签Label()、关系RelatedTo()/RelatedFrom。

    from py2neo.ogm import GraphObject, Property, RelatedTo, RelatedFrom, Label
    class Person(GraphObject):
      # 定义主键
      __primarykey__ = 'name'
      # 定义类的属性
      name=Property()
      age=Property()
      # 定义类的标签
      student=Label()
      # 定义Person指向的关系
      knows=RelatedTo('Person','KNOWS')
      # 定义指向Person的关系
      known=RelatedFrom('Person','KNOWN')
    
    

    通过类方法wrap()可以将一个普通节点转化为类的对象。

    类方法match(graph,primary_key)可以在graph中查找主键值为primary_key的节点

    可以直接通过类构造方法创建一个对象,并直接访问对象的属性及方法,并通过关系方法add()添加关系

    类的标签是一个bool值,默认为False,将其修改为True,即可为对象添加标签

    # 将节点c转化为OGM类型
    c=Person.wrap(c)
    print(c.name)
    # 查找Person类中主键(name)为Alice的节点
    ali=Person.match(graph,'Alice').first()
    # 创建一个新的Person对象并对其属性赋值
    new_person = Person()
    new_person.name = 'Durant'
    new_person.age = 28
    # 标签值默认为False
    print(new_person.student)
    # 修改bool值为True,为对象添加student标签
    new_person.student=True
    # 将修改后的图写入数据库
    graph.push(ali)
    
    

    在定义节点类时还可以定义其相关的关系,例如通过RelatedTo()定义从该节点指出的关系,RelatedFrom()定义指向该节点的关系。通过对象调用关系的对应的方法完成节点周围的关系操作,例如add()添加关系,clear()清除节点所有的关系,get()获取关系属性,remove()清楚指定的关系,update()更新关系

    class Person(GraphObject):
      # 定义Person指向的关系
      knows=RelatedTo('Person','KNOWS')
      # 定义指向Person的关系
      known=RelatedFrom('Person','KNOWN')
    # 新建一个从ali指向new_person的关系
    ali.knows.add(new_person)
    # 清除ali节点所有的know关系
    ali.knows.clear()
    # 清除ali节点指向new_person的那个know关系
    ali.knows.remove(new_person)
    # 更新ali指向new_person关系的属性值
    ali.knows.update(new_person,year=5)
    # 获取ali指向new_person关系的属性year的值
    ali.knows.get(new_person,'year')
    
    

    通过图对象也可以调用match方法对节点、关系进行匹配

    # 获取第一个主键name名为Alice的Person对象
    ali = Person.match(graph, 'Alice').first()
    # 获取所有name以B开头的Person对象
    Person.match(graph).where("_.name =~ 'B.*'")