Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC(4.5) - 动态Cypher执行

有时候,我们需要更加灵活的Cypher查询执行,例如在创建节点时根据变量的值决定节点的标签,这时可以使用APOC中cypher执行相关的过程。

接口

功能

CALL apoc.cypher.run(
  fragment,
  params
)
YIELD value

使用给定的参数执行数据库读取查询。

函数

apoc.cypher.runFirstColumnSingle

(statement, params)

使用给定的参数执行数据库读取查询并仅返回第一列,将返回第一行/单行或返回null。

函数

apoc.cypher.runFirstColumnMany
(statement, params)

使用给定的参数执行数据库读取查询并仅返回第一列,将返回包含所有行的列表。

CALL apoc.cypher.runFile(
  file or url,
  {config}
)
YIELD row, result

运行文件中的每个语句,语句以分号隔开。目前不支持数据库模式操作。

CALL apoc.cypher.runFiles(
  [files or urls],
  {config}
)
YIELD row, result

运行多个文件中的查询语句。

CALL apoc.cypher.runSchemaFile(
  file or url,
  {config}
)
 

运行文件中的每个数据库模式操作语句,所有语句以分号分开。

CALL apoc.cypher.runMany(
 'statements1;...',
 {params},
 {config}
)

运行每个分号分隔的语句并返回摘要。该过程不支持数据库模式操作。

CALL apoc.cypher.mapParallel(
  fragment,
  params,
  list-to-parallelize
) YIELD value

以并行批处理方式执行查询。

CALL apoc.cypher.doIt(
  fragment,
  params
) YIELD value

使用给定的参数执行数据库更新查询。

CALL apoc.cypher.runTimeboxed(
  'cypherStatement',
  {params},
  timeout
)

以预定义时间窗口运行Cypher查询,如果超时仍没有完成则中止语句。

下面的例子中,首先得到数据库中所有标签,然后统计拥有每个标签的节点的数量:

// 读取数据库中所有标签的名称,统计该类标签下节点总数,
//          返回所有节点数 >0的标签及统计结果。
//  参数:- fragment: 动态Cypher查询
//        - params: {limit:0} 
//    返回:节点计数
CALL db.labels() YIELD label
CALL apoc.cypher.run(
  "MATCH (:`" + label + "`) WITH count(*) AS count WHERE count > $limit RETURN count", 
  {limit:0}) YIELD value
RETURN label, value.count AS count

如果要控制查询的执行时间,可以用runTimeboxed()过程:

// 限定超时执行查询。
//          计算1亿次加法,超时3秒则终止执行。如果在3秒中执行完成,
//          结果在value变量中返回。
//  参数:- fragment: Cypher查询
//        - params: {}
//        - timeout: 3000ms 
//   返回:节点计数
CALL apoc.cypher.runTimeboxed(
  'UNWIND range(1,10000) AS a1 UNWIND range(1,10000) AS a2 WITH a1+a2 AS a RETURN sum(a) AS sum',
  {}, 3000, true
) YIELD value
RETURN value

如果要执行动态数据库更新,使用doIt()过程:

// 复制数据库中所有节点,仅包含name属性。
//          使用apoc.periodic.iterate过程控制执行批次。
//          在iterate的操作查询中使用apoc.cypher.doIt来创建节点。
//          新节点的标签来自于已存在的节点的第一个标签。
//      返回:创建的节点
CALL apoc.periodic.iterate(
  'MATCH (n) RETURN n',
  "CALL apoc.cypher.doIt(\"CREATE (m:\"+ labels(n)[0] + \") SET m.name='\" + n.name + \"'\ RETURN m",{}) YIELD value RETURN value.m",
  {batchSize:10}
)

 

 

 

你可能感兴趣的:(Neo4j高级应用技术专题,APOC,图数据库)