Neo4j 发明了Cypher,一种面向图模式匹配的、声明型查询语言。Cypher拥有丰富的特性。这里我们举例说明怎样在Cypher中实现循环执行。
简单情况下,Cypher会对查询的结果中的每项内容进行循环处理。例如:
// 搜索匹配的节点,然后对每个节点执行更新属性的操作
MATCH (n:Node{type:'type'})
SET n.date= today()
如果知道循环次数的话,可以用range()函数创建一个包含循环变量的数组,然后用UNWIND命令展开数组:
// 循环执行100次
WITH range(1,100) AS it
UNWIND it AS i
MATCH …
如果需要根据一个路径集合中节点或者边集合执行循环:
// 根据路径中节点数进行循环,使用nodes(path)函数
// 如果是对边操作,可以用relationships(path)函数
MATCH path = (a) -[:LIKES]-> (b)
WITH nodes(path) AS nodes
UNWIND nodes AS node
… …
多重循环的例子:
// 二重循环: 生成九九乘法表
WITH range(1,9) AS it1
WITH range(1,9) AS it2
UNWIND it1 AS i
UNWIND it2 AS j
RETURN i* j
在更新数据库时,如果有大量节点要更新、建议将更新切分成小的批次,控制每次更新的次数(例如每次1000个节点),那么可以使用APOC扩展包中的apoc.periodic.iterate()和apoc.periodic.commit()过程。关于这2个过程的使用方法参见相关文章:
- Neo4j图数据库:怎样安装Neo4j APOC扩展包?
- Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC(4.2) - 循环执行 commit
- Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC(4.3) - 循环执行 iterate