这篇笔记还是接着谈Graph,但是引入一个新的类Transaction。
Graph表示的是Neo4j中的图数据库,Transaction则是对Graph进行一系列操作的Cypher语句的容器。
跨专业不恰当类比一下,Graph就好比表示年终状态的资产负债表,是某个时间点的状态,是静态的;Transaction就是期间进行的一系列操作,比如现金流量、所有者权益变动,是动态操作。
所以,Transaction是对Graph的一系列操作的集合,Graph的很多操作也就是transaction的操作,例如以下这些:
graph.begin(autocommit=False) #开始一个新的transaction,默认是不自动执行的(操作先暂存在transaction里),如果autocommit=True则自动执行
graph.create(subgraph)
graph.delete(subgraph) #该语句自动执行
graph.separate(subgraph) #删除子图中的关系
graph.evaluate(“cypher语句”)#返回第一条记录的第一个值,自动执行
graph.exists(subgraph) #判断子图是否存在,自动执行
graph.merge(subgraph, primary_label=None, primary_key=None) #这个merge和cypher的merge有所区别,它首先是在Neo4j中寻找匹配的远程node,如果没有就创建节点,如果有就更新节点;然后是匹配关系,同样创建或更新
graph.run(“cypher语句”)#自动执行cypher语句
相应地,Transaction类中也就有create() delete() separate() evaluate() exists() merge() run()这些方法,以及之前提到的pull() push()方法,不过它们都不是自动执行的,而是将操作先暂存在transaction中,然后用transaction.commit()执行
此外,transcation还有以下方法
transaction.finished() #判断transaction是否执行完成
transaction.rollback() #回滚,撤销当前transaction的所有操作
graph也还有一些和transaction无关的“静态”操作,例如
graph.match()
graph.nodes
graph.relationships
这里v4的查找节点的函数和v3不一样了,代码示例如下:
graph = Graph()
matcher = NodeMatcher(graph)
matcher.match("Person", name="Alice").first()