• 首页
  • XEL中文网
  • BMAX中文网
  • Hello Puppy中文网
  • XEL中文网

    你的位置:Musk Dao中文网 > XEL中文网 >

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

    发布日期:2024-10-22 15:37    点击次数:89

    本文实例讲述了Python使用py2neo操作图数据库neo4j的方法。分享给大家供大家参考,具体如下:

    1、概念

    图:数据结构中的图由节点和其之间的边组成。节点表示一个实体,边表示实体之间的联系。

    图数据库:以图的结构存储管理数据的数据库。其中一些数据库将原生的图结构经过优化后直接存储,即原生图存储。还有一些图数据库将图数据序列化后保存到关系型或其他数据库中。

    之所以使用图数据库存储数据是因为它在处理实体之间存在复杂关系的数据具有很大的优势。使用传统的关系型数据库在处理数据之间的关系时其实很不方便。例如查询选修一个课程的同学时需要join两个表,查询选修某个课程的同学还选修什么课程,这就需要两次join操作,当涉及到十分复杂的关系以及庞大的数据量时,关系型数据库效率十分低下。而通过图存储,可以通过节点之间的边十分便捷地查询到结果。

    图模型:

    节点(Node)是主要的数据元素,表示一个实体。

    属性(Properties)用于描述实体的特征,以键值对的方式表示,其中键是字符串,可以对属性创建索引和约束。

    关系(Relationships)表示实体之间的联系,关系具有方向,实体之间可以有多个关系,关系也可以具有属性

    标签(Label)用于将实体分类,一个实体可以具有多个标签,对标签进行索引可以加速查找

    2、Neo4j

    Neo4j是目前最流行的图数据库,它采用原生图存储,在windows中下载安装访问如下地址https://neo4j.com/download/community-edition/。在Linux下通过如下命令下载解压

    修改配置文件conf/neo4j.conf

    在bin目录下执行 ./neo4j start,启动服务,在浏览器http://服务器ip地址:7474/browser/可以看到neo4j的可视化界面

    3、py2neo

    py2neo是一个社区第三方库,通过它可以更为便捷地使用python来操作neo4j

    安装py2neo:pip install py2neo,我安装的版本是4.3.0

    3.1、Node与Relationship

    创建节点和它们之间的关系,注意在使用下面的py2neo相关类之前首先需要import导入:

    Node 和 Relationship 都继承了 PropertyDict 类,类似于python的dictionary,可以通过如下方式对 Node 或 Relationship 进行属性赋值和访问

    3.2、Subgraph

    由节点和关系组成的集合就是子图,通过关系运算符求交集&、并集|、差集-、对称差集^

    subgraph.labels返回子图中所有标签集合,keys()返回所有属性集合,nodes返回所有节点集,relationships返回所有关系集

    通常将图中的所有节点和关系构成一个子图后再统一写入数据库,与多次写入单个节点相比效率更高

    3.3、Walkable

    walkable是在子图subgraph的基础上增加了遍历信息的对象,通过它可以便捷地遍历图数据库。

    通过+号将关系连接起来就构成了一个walkable对象。通过walk()函数对其进行遍历,可以利用 start_node、end_node、nodes、relationships属性来获取起始 Node、终止 Node、所有 Node 和 Relationship

    运行结果为:

    (:Person {age: 20, name: 'Bob'}) (Bob)-[:KNOWS {}]->(Alice) (:Person {age: 21, name: 'Alice'}) (Alice)-[:LIKES {}]->(Mike) (:Person {name: 'Mike'}) (Bob)-[:KNOWS {}]->(Mike) (:Person {age: 20, name: 'Bob'}) 起始节点: (:Person {age: 22, name: 'Bob', sex: 'female'})  终止节点: (:Person {age: 22, name: 'Bob', sex: 'female'}) 节点列表: ((:Person {age: 22, name: 'Bob', sex: 'female'}), (:Person {age: 21, name: 'Alice'}), (:Person {name: 'Mike'}), (:Person {age: 22, name: 'Bob', sex: 'female'})) 关系列表: ((Bob)-[:KNOWS {time: '2019/09/03'}]->(Alice), (Alice)-[:LIKES {}]->(Mike), (Bob)-[:KNOWS {}]->(Mike))

    3.4、Graph

    py2neo通过graph对象操作neo4j数据库,目前的neo4j只支持一个数据库定义一张图

    通过Graph的初始化函数完成对数据库的连接并创建一个graph对象

    graph.create()可以将子图写入数据库,也可以一次只写入一个节点或关系

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

    graph.seperate()删除指定关系

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

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

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

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

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

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

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

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

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

    3.5、OGM

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

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

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

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

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

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

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

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

    也可以通过图graph对节点对象进行操作:

    更多关于Python相关内容感兴趣的读者可查看本站专题:《Python常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

    希望本文所述对大家Python程序设计有所帮助。



    上一篇:没有了

    下一篇:没有了