### 14.1.4. Run Cypher Script Files

Runs each statement in the file / each file, all semicolon separated

You can use them with files that are usually run by cypher-shell or neo4j-shell, e.g. generated by `apoc.export.cypher.*` They automatically skip `:begin/:commit/:rollback` operations as they are executed in a single transaction per file.

Data Operations only:

- `apoc.cypher.runFile(file or url,[{config}])`
- `apoc.cypher.runFiles([files or urls],[{config})])`

Schema Operations only:

- `apoc.cypher.runSchemaFile(file or url,[{config}])`
- `apoc.cypher.runSchemaFiles([files or urls],[{config})])`

The `apoc.cypher.run*File(s)` procedures have some optional configuration:

- `{statistics:true/false}` to output a row of update-stats per statement, default is true
- `{timeout:1 or 10}` for how long the stream waits for new data, default is 10

#### 14.1.4.2. WHEN Procedures

`CALL apoc.when(condition, ifQuery, elseQuery:'', params:{}) yield value` | based on the condition, executes read-only ifQuery or elseQuery with the given parameters
`CALL apoc.do.when(condition, ifQuery, elseQuery:'', params:{}) yield value` | based on the condition, executes writing ifQuery or elseQuery with the given parameters

For example, if we wanted to match to neighbor nodes one and two traversals away from a start node, and return the smaller set (either those one hop away, or those that are two hops away), we might use:

     MATCH (start:Node)-[:REL]->(a)-[:REL]->(b)
     WITH collect(distinct a) as aNodes, collect(distinct b) as bNodes
     CALL apoc.when(size(aNodes) <= size(bNodes), 'RETURN aNodes as resultNodes', 'RETURN bNodes as resultNodes', {aNodes:aNodes, bNodes:bNodes}) YIELD value
     RETURN value.resultNodes as resultNodes

Or, if we wanted to conditionally set or create graph elements if we deem some account to be suspicious, but still want to continue other query operations in either case, we could use `apoc.do.when`:

    MATCH (acc:Account)
    OPTIONAL MATCH (acc)-[r:ACCESSED_BY]->(suspect:User)
    WHERE suspect.id in {suspiciousUsersIdList}
    CALL apoc.do.when(r IS NOT NULL, 'SET acc:Suspicious', '', {acc:acc}) YIELD value
    // ignore value and continue
    WITH acc
    ...

#### 14.1.4.3. CASE Procedures

For more complex conditional logic, case procedures allow for a variable-length list of condition / query pairs, where the query following the first conditional evaluating to true is executed. An elseQuery block is executed if none of the conditionals are true.

`CALL apoc.case([condition, query, condition, query, …​], elseQuery:'', params:{}) yield value` | given a list of conditional / read-only query pairs, executes the query associated with the first conditional evaluating to true (or the else query if none are true) with the given parameters
`CALL apoc.do.case([condition, query, condition, query, …​], elseQuery:'', params:{}) yield value` | given a list of conditional / writing query pairs, executes the query associated with the first conditional evaluating to true (or the else query if none are true) with the given parameters

If we wanted to MATCH to selection nodes in a column, we could use entirely different MATCHES depending on query parameters, or based on data already in the graph:

     MATCH (me:User{id:{myId}})
     CALL apoc.case(
      [{selection} = 'friends', "RETURN [(me)-[:FRIENDS]-(friend) | friend] as selection",
       {selection} = 'coworkers', "RETURN [(me)-[:WORKS_AT*2]-(coworker) | coworker] as selection",
       {selection} = 'all', "RETURN apoc.coll.union([(me)-[:FRIENDS]-(friend) | friend], [(me)-[:WORKS_AT*2]-(coworker) | coworker]) as selection"],
       'RETURN [] as selection', {me:me}) YIELD value
     RETURN value.selection as selection