欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python使用Neo4j图数据库——py2neo详解(1)

程序员文章站 2022-05-19 11:58:55
...

0 前言

Py2neo是一个客户端库和工具包,可通过Python应用程序内部和命令行使用Neo4j。该库支持Bolt和HTTP,并提供高级API,OGM,管理工具,交互式控制台,用于Pygments的Cypher词法分析器以及许多其他功能。与以前的版本不同,Py2neo不需要启用HTTP的服务器,并且可以完全通过Bolt运行。

当考虑使用py2neo还是Neo4j的官方Python驱动程序时,需要权衡取舍。Py2neo提供了更高级别的API和OGM,但是官方驱动程序提供了与集群一起使用的机制,例如自动重试。如果您不熟悉Neo4j,需要OGM,不想立即学习Cypher或需要数据科学集成,则py2neo可能是更好的选择。如果您正在构建高可用性企业应用程序,或者正在使用群集,则可能需要官方驱动程序。

官方文档

1 安装

  • 直接使用pip install py2neo安装
  • 使用pip install --upgrade py2neo更新到最新稳定版本
  • 使用pip install --upgrade --pre py2neo安装最新的预发行版本
  • 支持python版本:2.7/3.5/3.6/3.7/3.8
  • 支持Neo4j版本:3.2/3.3/3.4/3.5/4.0(建议使用最新的预发行版)

2 py2neo.data

2.1 Node和Relation对象

图模型的两个基本构建就是Node和Relation。节点是图形内数据存储的基本单位。它可以包含一组键/值对(属性),并且可以选择用一个或多个文本标签进行装饰。关系是一对节点之间(或单个节点上的循环)之间的有类型的定向连接。跟节点一样,关系也可以包含一组属性。

下面的代码显示了如何创建几个节点以及将它们连接起来的关系。每个节点都有一个属性,名称,并被标记为Person。该关系ab描述了从第一节点到第二节点的KNOWS连接。ab

from py2neo.data import Node, Relation
a = Node('Person', name='Alice')
b = Node('Person', name='Bob')
ab = Relation(a, 'knows', b)
# ab (Alice)-[:knows]->(Bob)

类py2neo.data.Node(*标签, **属性)
使用指定的标签和属性构造一个新的节点对象。在其初始状态下,节点是unbound。这意味着它仅存在于客户端上,而不会引用相应的服务器节点。节点通常是是creating后,才会出现在Neo4j数据库。
常用方法:

  • node == other:如果节点node和节点other相等,则返回True。节点相等性完全基于它所代表的节点的ID。属性和标签都不会影响平等。这意味着,如果节点绑定到数据库中,则进行判断的两个节点是否相等,取决于它们是否绑定到同一数据库节点。如果一个节点是未绑定的,因此没有相应的节点ID,则该节点只能等于其自身。
  • node != other:如果节点不相等,则返回True。
  • hash(node):根据节点对象的ID(如果未绑定)或它表示的数据库节点的ID(如果绑定)返回节点的哈希值。
  • node[key]:返回节点属性中key对应的值,如果没有key返回None。
  • node[key] = value:将节点属性key的值设置为value,value可以为None。
  • del node[key]:删除节点key对应的属性,如果不存在会抛出keyerror。
  • len(node):返回节点属性的数量。
  • dict(node):返回节点的所有属性和值,形式是字典。
  • walk(node):yield node as the only item in a walk()。
  • node.labels:返回与node关联的完整标签集。此集合是不可变的,不能用于添加或删除标签。
  • node.has_label(标签):如果节点具有标签label,则返回True。
  • node.add_label(标签):将标签添加到node。
  • node.remove_label(标签):从节点除去标签,如果不存在,则引发ValueError。
  • node.clear_labels():删除节点的所有标签。
  • node.update_labels(标签集):从可迭代的标签集向节点添加多个标签。
  • node.graph:节点绑定到数据库。
  • node.identity:如果节点绑定到数据库,返回节点的ID。

类py2neo.data.Realtionship()
用法:
py2neo.data.Relationship(start_node,type,end_node,** 属性)
py2neo.data.Relationship(start_node,end_node,** 属性)
py2neo.data.Relationship(节点,类型,** 属性)
py2neo.data.Relationship(node,** 属性)

 c = Node("Person", name="Carol")
class WorksWith(Relationship): pass
ac = WorksWith(a, c)
type(ac)
# 'WORKS_WITH'

常用函数:

  • relationship == other:如果relationship和other相等,则返回True。关系相等性基于开始节点,结束节点和关系类型的相等性(上面描述了节点相等性)。这意味着相同节点之间相同类型的任何两个关系始终被视为相等。请注意,此行为与Neo4j本身稍有不同,Neo4j允许在相同节点之间使用相同类型的多个关系。
  • relationship != other:如果关系不相等,则返回True。
  • hash(relationship):根据其开始节点,结束节点和类型返回关系的哈希。
  • relationship[key]:返回关系的属性key的值。如果没有返回None
  • relationship[key] = value:设置关系的属性key的值,若value是None,则删除属性值。
  • del relationship[key]:从关系中删除key的属性值,如果不存在这样的属性,则引发KeyError。
  • len(relationship):返回关系中的属性数。
  • dict(relationship):返回关系中所有属性的字典。
  • walk(relationship):执行walk(),依次产生其起始节点,关系本身及其终止节点。
  • type(relationship):返回此关系的类型。
  • relationship.graph:关系绑定到的数据库(如果有)。
  • relationship.identity:数据库中关系的ID。

Node和Relationship都继承PropertyDict,PropertyDict继承Python的内置词典类。这意味着节点和关系都是可以包含按键索引的属性值的映射类型。

类py2neo.data.PropertyDict(iterable,** kwargs)
该PropertyDict继承Python的内置字典类型。除了下面描述的那些操作和方法外,所有操作和方法均与其基类相同。
常用方法:

  • properties == other:如果properties 等于other返回True,其中other是删除掉所有None值再和properties比较。
  • properties != other:不等,返回True。
  • properties[key]:返回key属性的值,若没有返回None。
  • properties[key] = value:设置属性值。
  • setdefault(key,默认= None):如果key在PropertyDict中,则返回其值。如果不是,key属性插入具有默认值,并返回默认值,除非default为None,在这种情况下不执行任何操作。
  • update(可迭代= None,** kwargs):使用来自iterable的键值对以及后面来自kwargs的关键字参数更新PropertyDict 。个别属性已经在PropertyDict中将被覆盖。

2.2 Subgraph

Subgraph是节点和关系的任意集合。根据定义,子图必须至少包含一个节点;空子图应以表示None。要测试是否为空,可以使用bool()内置功能。
构造子图的最简单方法是使用标准集合操作将节点和关系组合在一起。例如:

>>> s = ab | ac
>>> s
{(alice:Person {name:"Alice"}),
 (bob:Person {name:"Bob"}),
 (carol:Person {name:"Carol"}),
 (Alice)-[:KNOWS]->(Bob),
 (Alice)-[:WORKS_WITH]->(Carol)}
>>> s.nodes()
frozenset({(alice:Person {name:"Alice"}),
           (bob:Person {name:"Bob"}),
           (carol:Person {name:"Carol"})})
>>> s.relationships()
frozenset({(Alice)-[:KNOWS]->(Bob),
           (Alice)-[:WORKS_WITH]->(Carol)})

类py2neo.data.Subgraph(节点,关系)

  • subgraph | other | ...:并集。返回subgraph、other包含的所有节点和关系构成的的新的子图。任何实体将仅被包含一次。
  • subgraph & other & ...:交集。返回一个新的子图,其中包含该子图和other共有的所有节点和关系。
  • subgraph - other - ...:减。返回一个新的子图,子图中的节点和关系是subgraph中含有的,但在不存在other中的,通过关系相连的节点也包含在新子图中,不管这些节点是否存在于subgraph或者other中。
  • subgraph ^ other ^ ...:返回一个新的子图,该子图包含的节点和关系只出现在subgraph中或者other中,通过关系相连的节点也包含在新子图中,不管这些节点是否存在于subgraph或者other中。
  • subgraph.keys():返回该子图中节点和关系使用的所有属性键的集合。
  • subgraph.labels:返回此子图中所有节点标签的集合。
  • subgraph.nodes:返回此子图中所有节点的集合。
  • subgraph.relationships:返回此子图中所有关系的集合。
  • subgraph.types():返回此子图中所有关系类型的集合。

2.3 Path对象和其他Walkable类型

Walkable是指Subgraph具有附加遍历信息。 构造walkable的最简单方法是连接其他图对象:

>>> w = ab + Relationship(b, "LIKES", c) + ac
>>> w
(Alice)-[:KNOWS]->(Bob)-[:LIKES]->(Carol)<-[:WORKS_WITH]-(Alice)

通过使用该walk()函数可实现可行走对象的遍历,该函数产生交替的节点和关系,并且始终以节点开始和结束。任何节点或关系都可以在任何方向上遍历一次或多次。

类py2neo.data.Walkable(iterable)
常用方法:

  • walkable + other + ...:级联。返回一个新的walkbale对象,walkable的尾结点与other的头节点相同。
  • walk(walkable):walkable对象执行一个walk(),产生交替的节点和关系。
  • start_node:返回在walk()此对象的上遇到的第一个节点。
  • end_node:返回walk()此对象上遇到的最后一个节点。
  • nodes:返回在walkable上遍历的所有节点的元组,按首次遇到的顺序列出。
  • relationships:返回一个在walkable上遍历的所有关系的元组,这些关系按首次遇到的顺序列出。

类py2neo.data.Path(* 实体)
通过一些cypher查询返回的walkable对象。

py2neo.data.walk(* walkbales)
遍历提供的参数,依次产生交替的节点和关系。

2.4 Record对象

类py2neo.data.Record(iterable= ())
一个Record对象包含有序的键值对集合。它在许多方面类似于namedtuple,但是仅允许通过方括号语法访问字段并提供更多功能。 Record继承自tuple和Mapping。
常用方法:

  • record[index]record[key]:返回具有指定键或索引的record的值。
  • len(record):返回record中的字段数。
  • dict(record):返回记录的字典表示形式。
  • data(* keys):以字典形式返回此记录的键和值,可以选择仅按索引或键仅包含某些值。所提供的记录中不存在的键将被包括在内,其值为None;提供的索引超出范围将触发IndexError。
    • parameters:keys –要包括的项目的索引或键;如果未提供任何值,则将包含所有值
    • return:值字典,以字段名称为jey
    • raises: IndexError 如果指定了越界索引
  • get(key,default= None):通过索引或键从记录中获取一个值。如果指定的项目不存在,则返回默认值。
    • parameters:
      • key –索引或键
      • default –如果键不存在,则返回默认值
    • return:选择值
  • index(key):返回给定项目的索引。
  • items(* keys):返回键和值组成元组的列表
    • parameters:key 要包括的项目的索引或键;如果未提供任何值,则将包含所有值
    • return(键,值)元组列表
  • keys():返回记录的键的列表。
  • to_subgraph():返回一个Subgraph包含这个Record中所有图的并集。
  • values(* keys):返回记录的值,可以选择通过key或者index过滤只包含确定的值。
    • parameters:要包括的item的索引或键;如果未提供任何值,则将包含所有值
    • return 值的列表。

2.5 Table对象

类py2neo.data.Table(records,keys= None)
Table是包含Record对象列表,通常作为Cypher查询的结果。它提供了一个方便的容器来完整地处理结果,并提供了转换为各种输出格式的方法。Table继承list。
常用方法:

  • repr(table):返回包含此表的ASCII表示形式的字符串。在内部,此方法调用write()使用header = True调用,输出io.StringIO实例。

  • _repr_html_():返回包含此表的HTML表示形式的字符串。Jupyter笔记本使用此方法在浏览器中本地显示table。在内部,此方法write_html()使用header = True调用,输出io.StringIO实例。

  • keys():返回此表的字段名称列表。

  • field(key):返回给定字段的元数据字典。元数据包含以下值:

    • 类型:表示字段值的单个类或元组。
    • 数字:如果所有字段值都是数字类型,则为True,否则False。
    • 可选的:如果任何字段值为None, 则为True,否则为False。
  • write(file = None,header = None,skip = None,limit = None,auto_align = True,padding = 1,separator= '|',newline = '\ r \ n')
    将数据写入人类可读的ASCII表。

    • parameters:
      • file –能够接收输出的类似文件的对象
      • header –用于添加列标题的布尔值标志
      • skip -开始输出前要跳过的记录数
      • limit –输出中包含的最大记录数
      • auto_align – if True,将数值右对齐
      • padding–列分隔符和值之间要包含的空格数
      • separator –列分隔符
      • newline –换行符序列
    • return:输出中包含的记录数
  • write_html(file = None,header = None,skip = None,limit = None,auto_align = True):将数据写入HTML表。

    • parameters:
      • file –能够接收输出的类似文件的对象
      • header –用于添加列标题的布尔值标志
      • skip -开始输出前要跳过的记录数
      • limit –输出中包含的最大记录数
      • auto_align – if True,将数值右对齐
    • return:输出中包含的记录数
  • write_separated_values(separeter,file= None,header= None,skip= None,limit= None,newline= '\ r \ n',quote= '“'):将数据写入分隔符分隔的文件。

    • parameters:
      • separator –字段分隔符
      • file –能够接收输出的类似文件的对象
      • header –布尔标志(或click.secho样式字典),用于添加列标题
      • skip -开始输出前要跳过的记录数
      • limit –输出中包含的最大记录数
      • newline –换行符序列
      • quote–quote字符
    • return:输出中包含的记录数
  • write_csv(file = None,header = None,skip = None,limit = None):将数据写为RFC4180兼容的逗号分隔值。这是对的自定义调用write_separated_values()。

  • write_tsv(file = None,header = None,skip = None,limit = None):将数据写成制表符分隔的值。这是对的自定义调用write_separated_values()。