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

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

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

    graph.delete()删除指定子图,graph.delete_all()删除所有子图

    graph.seperate()删除指定关系

    # 初始化连接neo4j数据库,参数依次为url、用户名、密码
    graph = Graph('http://localhost:7474', username='neo4j', password='123456')
    # 写入子图w
    graph.create(w)
    # 删除子图w
    graph.delete(w)
    # 删除所有图
    graph.delete_all()
    # 删除关系rel
    graph.separate(rel)
    
    

    graph.match(nodes=None, r_type=None, limit=None)查找符合条件的关系,第一个参数为节点集合或者集合(起始节点,终止节点),如果省略代表所有节点。第二个参数为关系的属性,第三个为返回结果的数量。也可以使用match_one()代替,返回一条结果。例如查找所有节点a认识的人:

    # 查找所有以a为起点,并且属性为KNOWS的关系
    res = graph.match((a, ), r_type="KNOWS")
    # 打印关系的终止节点,即为a所有认识的人
    for rel in res:
      print(rel.end_node["name"])
    
    

    使用graph.nodes.match()查找指定节点,可以使用first()、where()、order_by()等函数对查找做高级限制

    还可以通过节点或关系的id查找

    # 查找标签为Person,属性name="Alice"的节点,并返回第一个结果
    graph.nodes.match("Person", name="Alice").first()
    # 查找所有标签为Person,name以B开头的节点,并将结果按照age字段排序
    res = graph.nodes.match("Person").where("_.name =~ 'B.*'").order_by('_.age')
    for node in res:
      print(node['name'])
    # 查找id为4的节点
    t_node = graph.nodes[4]
    # 查找id为196的关系
    rel = graph.relationships[196]
    
    

    通过Graph对象进行Cypher操作并处理返回结果

    graph.evaluate()执行一个Cypher语句并返回结果的第一条数据

    # 执行Cypher语句并返回结果集的第一条数据
    res = graph.evaluate('MATCH (p:Person) return p')
    # 输出:(_3:Person {age: 20, name: 'Bob'})
    print(res)
    
    

    graph.run()执行Cypher语句并返回结果数据流的游标Cursor,通过forward()方法不断向前移动游标可以向前切换结果集的每条记录Record对象

    # 查询(p1)-[k]->(p2),并返回所有节点和关系
    gql="MATCH (p1:Person)-[k:KNOWS]->(p2:Person) RETURN *"
    cursor=graph.run(gql)
    # 循环向前移动游标
    while cursor.forward():
      # 获取并打印当前的结果集
      record=cursor.current
      print(record)
    
    

    打印的每条Record记录对象如下所示,可以看到其中的元素是key=value的集合,通过方法get(key)可以取出具体元素。通过方法items(keys)可以将记录中指定的key按(key,value)元组的形式返回

    <Record k=(xiaowang)-[:KNOWS {}]->(xiaozhang) p1=(_96:Person {name: 'xiaowang'}) p2=(_97:Person {name: 'xiaozhang'})>
      record = cursor.current
      print('通过get返回:', record.get('k'))
      for (key, value) in record.items('p1', 'p2'):
        print('通过items返回元组:', key, ':', value)
    # 运行结果如下
    '''
    通过get返回: (xiaowang)-[:KNOWS {}]->(xiaozhang)
    通过items返回元组: p1 : (_92:Person {name: 'xiaowang'})
    通过items返回元组: p2 : (_93:Person {name: 'xiaozhang'})
    '''
    
    

    还可以将graph.run()返回的结果通过data()方法转化为字典列表,所有结果整体上是一个列表,其中每一条结果是字典的格式,其查询与结果如下,可以通过访问列表与字典的方式获取数据:

    # 查询(p1)-[k]->(p2),并返回所有节点和关系
    gql = "MATCH (p1:Person)-[k:KNOWS]->(p2:Person) RETURN *"
    res = graph.run(gql).data()
    print(res)
    #结果如下:
    '''
    [{'k': (xiaowang)-[:KNOWS {}]->(xiaozhang), 
     'p1': (_196:Person {name: 'xiaowang'}), 
     'p2': (_197:Person {name: 'xiaozhang'})}, 
    {'k': (xiaozhang)-[:KNOWS {}]->(xiaozhao), 
     'p1': (_197:Person {name: 'xiaozhang'}),
     'p2': (_198:Person {name: 'xiaozhao'})},
    {'k': (xiaozhao)-[:KNOWS {}]->(xiaoli),
     'p1': (_198:Person {name: 'xiaozhao'}),
     'p2': (_199:Person {name: 'xiaoli'})}
    ]
    '''