Running Cypher fragments
We can use Cypher as a safe, graph-aware, partially compiled scripting language within APOC.
Procedure Overview
The supported procedures are described in the table below:
| Qualified Name | Type | Release | 
|---|---|---|
| - executes writing fragment with the given parameters | 
 | 
 | 
| - executes reading fragment with the given parameters | 
 | 
 | 
| - runs each semicolon separated statement and returns summary | 
 | 
 | 
|  - executes fragments in parallel through a list defined in  | 
 | 
 | 
|  - executes fragments in parallel batches through a list defined in  | 
 | 
 | 
| - executes fragment in parallel batches with the list segments being assigned to _ | 
 | 
 | 
| - executes fragment in parallel batches with the list segments being assigned to _ | 
 | 
 | 
| 
 | 
 | |
| apoc.cypher.runFirstColumnMany  - executes statement with given parameters, returns first column only collected into a list, params are available as identifiers | 
 | 
 | 
| apoc.cypher.runFirstColumnSingle  - executes statement with given parameters, returns first element of the first column only, params are available as identifiers | 
 | 
 | 
Example: Fast Node-Counts by Label
We can quickly compute the number of nodes for a specific label using the count function, but only if that’s the only single thing in the query.
For example:
MATCH (:Person) RETURN count(*);We can also combine several with UNION ALL:
MATCH (:Person) RETURN count(*)
UNION ALL
MATCH (:Movie) RETURN count(*);But we can’t do the same thing using the WITH clause:
MATCH (:Person)
WITH count(*) as people
MATCH (:Movie) RETURN people, count(*) as movies;This query will work out the count by iterating over all nodes, which is a very slow operation
We can use apoc.cypher.run to construct the COUNT() statements and run each of them individually, so it completes in a few ms.
CALL db.labels() yield label
CALL apoc.cypher.run("match (:`"+label+"`) return count(*) as count", null) yield value
return label, value.count as countYou can use a similar approach to get the property-keys per label:
CALL db.labels() yield label
CALL apoc.cypher.run("MATCH (n:`"+label+"`) RETURN keys(n) as keys LIMIT 1",null) yield value
RETURN label, value.keys as keys