19.17. Batch operations

Note: You cannot use this resource to execute Cypher queries with USING PERIODIC COMMIT.

Execute multiple operations in batch

This lets you execute multiple API calls through a single HTTP call, significantly improving performance for large insert and update operations.

The batch service expects an array of job descriptions as input, each job description describing an action to be performed via the normal server API.

This service is transactional. If any of the operations performed fails (returns a non-2xx HTTP status code), the transaction will be rolled back and all changes will be undone.

Each job description should contain a to attribute, with a value relative to the data API root (so http://localhost:7474/db/data/node becomes just /node), and a method attribute containing HTTP verb to use.

Optionally you may provide a body attribute, and an id attribute to help you keep track of responses, although responses are guaranteed to be returned in the same order the job descriptions are received.

The following figure outlines the different parts of the job descriptions:

Figure 19.67. Final Graph

Example request

  • POST http://localhost:7474/db/data/batch
  • Accept: application/json; charset=UTF-8
  • Content-Type: application/json
[ {
  "method" : "PUT",
  "to" : "/node/65/properties",
  "body" : {
    "age" : 1
  },
  "id" : 0
}, {
  "method" : "GET",
  "to" : "/node/65",
  "id" : 1
}, {
  "method" : "POST",
  "to" : "/node",
  "body" : {
    "age" : 1
  },
  "id" : 2
}, {
  "method" : "POST",
  "to" : "/node",
  "body" : {
    "age" : 1
  },
  "id" : 3
} ]

Example response

  • 200: OK
  • Content-Type: application/json; charset=UTF-8
[ {
  "id" : 0,
  "from" : "/node/65/properties"
}, {
  "id" : 1,
  "body" : {
    "extensions" : {
    },
    "paged_traverse" : "http://localhost:7474/db/data/node/65/paged/traverse/{returnType}{?pageSize,leaseTime}",
    "labels" : "http://localhost:7474/db/data/node/65/labels",
    "outgoing_relationships" : "http://localhost:7474/db/data/node/65/relationships/out",
    "traverse" : "http://localhost:7474/db/data/node/65/traverse/{returnType}",
    "all_typed_relationships" : "http://localhost:7474/db/data/node/65/relationships/all/{-list|&|types}",
    "all_relationships" : "http://localhost:7474/db/data/node/65/relationships/all",
    "property" : "http://localhost:7474/db/data/node/65/properties/{key}",
    "self" : "http://localhost:7474/db/data/node/65",
    "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/65/relationships/out/{-list|&|types}",
    "properties" : "http://localhost:7474/db/data/node/65/properties",
    "incoming_relationships" : "http://localhost:7474/db/data/node/65/relationships/in",
    "incoming_typed_relationships" : "http://localhost:7474/db/data/node/65/relationships/in/{-list|&|types}",
    "create_relationship" : "http://localhost:7474/db/data/node/65/relationships",
    "data" : {
      "age" : 1
    }
  },
  "from" : "/node/65"
}, {
  "id" : 2,
  "location" : "http://localhost:7474/db/data/node/66",
  "body" : {
    "extensions" : {
    },
    "paged_traverse" : "http://localhost:7474/db/data/node/66/paged/traverse/{returnType}{?pageSize,leaseTime}",
    "labels" : "http://localhost:7474/db/data/node/66/labels",
    "outgoing_relationships" : "http://localhost:7474/db/data/node/66/relationships/out",
    "traverse" : "http://localhost:7474/db/data/node/66/traverse/{returnType}",
    "all_typed_relationships" : "http://localhost:7474/db/data/node/66/relationships/all/{-list|&|types}",
    "all_relationships" : "http://localhost:7474/db/data/node/66/relationships/all",
    "property" : "http://localhost:7474/db/data/node/66/properties/{key}",
    "self" : "http://localhost:7474/db/data/node/66",
    "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/66/relationships/out/{-list|&|types}",
    "properties" : "http://localhost:7474/db/data/node/66/properties",
    "incoming_relationships" : "http://localhost:7474/db/data/node/66/relationships/in",
    "incoming_typed_relationships" : "http://localhost:7474/db/data/node/66/relationships/in/{-list|&|types}",
    "create_relationship" : "http://localhost:7474/db/data/node/66/relationships",
    "data" : {
      "age" : 1
    }
  },
  "from" : "/node"
}, {
  "id" : 3,
  "location" : "http://localhost:7474/db/data/node/67",
  "body" : {
    "extensions" : {
    },
    "paged_traverse" : "http://localhost:7474/db/data/node/67/paged/traverse/{returnType}{?pageSize,leaseTime}",
    "labels" : "http://localhost:7474/db/data/node/67/labels",
    "outgoing_relationships" : "http://localhost:7474/db/data/node/67/relationships/out",
    "traverse" : "http://localhost:7474/db/data/node/67/traverse/{returnType}",
    "all_typed_relationships" : "http://localhost:7474/db/data/node/67/relationships/all/{-list|&|types}",
    "all_relationships" : "http://localhost:7474/db/data/node/67/relationships/all",
    "property" : "http://localhost:7474/db/data/node/67/properties/{key}",
    "self" : "http://localhost:7474/db/data/node/67",
    "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/67/relationships/out/{-list|&|types}",
    "properties" : "http://localhost:7474/db/data/node/67/properties",
    "incoming_relationships" : "http://localhost:7474/db/data/node/67/relationships/in",
    "incoming_typed_relationships" : "http://localhost:7474/db/data/node/67/relationships/in/{-list|&|types}",
    "create_relationship" : "http://localhost:7474/db/data/node/67/relationships",
    "data" : {
      "age" : 1
    }
  },
  "from" : "/node"
} ]

Refer to items created earlier in the same batch job

The batch operation API allows you to refer to the URI returned from a created resource in subsequent job descriptions, within the same batch call.

Use the {[JOB ID]} special syntax to inject URIs from created resources into JSON strings in subsequent job descriptions.

Figure 19.68. Final Graph

Example request

  • POST http://localhost:7474/db/data/batch
  • Accept: application/json; charset=UTF-8
  • Content-Type: application/json
[ {
  "method" : "POST",
  "to" : "/node",
  "id" : 0,
  "body" : {
    "name" : "bob"
  }
}, {
  "method" : "POST",
  "to" : "/node",
  "id" : 1,
  "body" : {
    "age" : 12
  }
}, {
  "method" : "POST",
  "to" : "{0}/relationships",
  "id" : 3,
  "body" : {
    "to" : "{1}",
    "data" : {
      "since" : "2010"
    },
    "type" : "KNOWS"
  }
}, {
  "method" : "POST",
  "to" : "/index/relationship/my_rels",
  "id" : 4,
  "body" : {
    "key" : "since",
    "value" : "2010",
    "uri" : "{3}"
  }
} ]

Example response

  • 200: OK
  • Content-Type: application/json; charset=UTF-8
[ {
  "id" : 0,
  "location" : "http://localhost:7474/db/data/node/57",
  "body" : {
    "extensions" : {
    },
    "paged_traverse" : "http://localhost:7474/db/data/node/57/paged/traverse/{returnType}{?pageSize,leaseTime}",
    "labels" : "http://localhost:7474/db/data/node/57/labels",
    "outgoing_relationships" : "http://localhost:7474/db/data/node/57/relationships/out",
    "traverse" : "http://localhost:7474/db/data/node/57/traverse/{returnType}",
    "all_typed_relationships" : "http://localhost:7474/db/data/node/57/relationships/all/{-list|&|types}",
    "all_relationships" : "http://localhost:7474/db/data/node/57/relationships/all",
    "property" : "http://localhost:7474/db/data/node/57/properties/{key}",
    "self" : "http://localhost:7474/db/data/node/57",
    "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/57/relationships/out/{-list|&|types}",
    "properties" : "http://localhost:7474/db/data/node/57/properties",
    "incoming_relationships" : "http://localhost:7474/db/data/node/57/relationships/in",
    "incoming_typed_relationships" : "http://localhost:7474/db/data/node/57/relationships/in/{-list|&|types}",
    "create_relationship" : "http://localhost:7474/db/data/node/57/relationships",
    "data" : {
      "name" : "bob"
    }
  },
  "from" : "/node"
}, {
  "id" : 1,
  "location" : "http://localhost:7474/db/data/node/58",
  "body" : {
    "extensions" : {
    },
    "paged_traverse" : "http://localhost:7474/db/data/node/58/paged/traverse/{returnType}{?pageSize,leaseTime}",
    "labels" : "http://localhost:7474/db/data/node/58/labels",
    "outgoing_relationships" : "http://localhost:7474/db/data/node/58/relationships/out",
    "traverse" : "http://localhost:7474/db/data/node/58/traverse/{returnType}",
    "all_typed_relationships" : "http://localhost:7474/db/data/node/58/relationships/all/{-list|&|types}",
    "all_relationships" : "http://localhost:7474/db/data/node/58/relationships/all",
    "property" : "http://localhost:7474/db/data/node/58/properties/{key}",
    "self" : "http://localhost:7474/db/data/node/58",
    "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/58/relationships/out/{-list|&|types}",
    "properties" : "http://localhost:7474/db/data/node/58/properties",
    "incoming_relationships" : "http://localhost:7474/db/data/node/58/relationships/in",
    "incoming_typed_relationships" : "http://localhost:7474/db/data/node/58/relationships/in/{-list|&|types}",
    "create_relationship" : "http://localhost:7474/db/data/node/58/relationships",
    "data" : {
      "age" : 12
    }
  },
  "from" : "/node"
}, {
  "id" : 3,
  "location" : "http://localhost:7474/db/data/relationship/14",
  "body" : {
    "extensions" : {
    },
    "start" : "http://localhost:7474/db/data/node/57",
    "property" : "http://localhost:7474/db/data/relationship/14/properties/{key}",
    "self" : "http://localhost:7474/db/data/relationship/14",
    "properties" : "http://localhost:7474/db/data/relationship/14/properties",
    "type" : "KNOWS",
    "end" : "http://localhost:7474/db/data/node/58",
    "data" : {
      "since" : "2010"
    }
  },
  "from" : "http://localhost:7474/db/data/node/57/relationships"
}, {
  "id" : 4,
  "location" : "http://localhost:7474/db/data/index/relationship/my_rels/since/2010/14",
  "body" : {
    "extensions" : {
    },
    "start" : "http://localhost:7474/db/data/node/57",
    "property" : "http://localhost:7474/db/data/relationship/14/properties/{key}",
    "self" : "http://localhost:7474/db/data/relationship/14",
    "properties" : "http://localhost:7474/db/data/relationship/14/properties",
    "type" : "KNOWS",
    "end" : "http://localhost:7474/db/data/node/58",
    "data" : {
      "since" : "2010"
    },
    "indexed" : "http://localhost:7474/db/data/index/relationship/my_rels/since/2010/14"
  },
  "from" : "/index/relationship/my_rels"
} ]

Execute multiple operations in batch streaming

Figure 19.69. Final Graph

Example request

  • POST http://localhost:7474/db/data/batch
  • Accept: application/json
  • Content-Type: application/json
  • X-Stream: true
[ {
  "method" : "PUT",
  "to" : "/node/131/properties",
  "body" : {
    "age" : 1
  },
  "id" : 0
}, {
  "method" : "GET",
  "to" : "/node/131",
  "id" : 1
}, {
  "method" : "POST",
  "to" : "/node",
  "body" : {
    "age" : 1
  },
  "id" : 2
}, {
  "method" : "POST",
  "to" : "/node",
  "body" : {
    "age" : 1
  },
  "id" : 3
} ]

Example response

  • 200: OK
  • Content-Type: application/json; charset=UTF-8
[ {
  "id" : 0,
  "from" : "/node/131/properties",
  "body" : null,
  "status" : 204
}, {
  "id" : 1,
  "from" : "/node/131",
  "body" : {
    "extensions" : {
    },
    "paged_traverse" : "http://localhost:7474/db/data/node/131/paged/traverse/{returnType}{?pageSize,leaseTime}",
    "labels" : "http://localhost:7474/db/data/node/131/labels",
    "outgoing_relationships" : "http://localhost:7474/db/data/node/131/relationships/out",
    "traverse" : "http://localhost:7474/db/data/node/131/traverse/{returnType}",
    "all_typed_relationships" : "http://localhost:7474/db/data/node/131/relationships/all/{-list|&|types}",
    "all_relationships" : "http://localhost:7474/db/data/node/131/relationships/all",
    "property" : "http://localhost:7474/db/data/node/131/properties/{key}",
    "self" : "http://localhost:7474/db/data/node/131",
    "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/131/relationships/out/{-list|&|types}",
    "properties" : "http://localhost:7474/db/data/node/131/properties",
    "incoming_relationships" : "http://localhost:7474/db/data/node/131/relationships/in",
    "incoming_typed_relationships" : "http://localhost:7474/db/data/node/131/relationships/in/{-list|&|types}",
    "create_relationship" : "http://localhost:7474/db/data/node/131/relationships",
    "data" : {
      "age" : 1
    }
  },
  "status" : 200
}, {
  "id" : 2,
  "from" : "/node",
  "body" : {
    "extensions" : {
    },
    "paged_traverse" : "http://localhost:7474/db/data/node/132/paged/traverse/{returnType}{?pageSize,leaseTime}",
    "labels" : "http://localhost:7474/db/data/node/132/labels",
    "outgoing_relationships" : "http://localhost:7474/db/data/node/132/relationships/out",
    "traverse" : "http://localhost:7474/db/data/node/132/traverse/{returnType}",
    "all_typed_relationships" : "http://localhost:7474/db/data/node/132/relationships/all/{-list|&|types}",
    "all_relationships" : "http://localhost:7474/db/data/node/132/relationships/all",
    "property" : "http://localhost:7474/db/data/node/132/properties/{key}",
    "self" : "http://localhost:7474/db/data/node/132",
    "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/132/relationships/out/{-list|&|types}",
    "properties" : "http://localhost:7474/db/data/node/132/properties",
    "incoming_relationships" : "http://localhost:7474/db/data/node/132/relationships/in",
    "incoming_typed_relationships" : "http://localhost:7474/db/data/node/132/relationships/in/{-list|&|types}",
    "create_relationship" : "http://localhost:7474/db/data/node/132/relationships",
    "data" : {
      "age" : 1
    }
  },
  "location" : "http://localhost:7474/db/data/node/132",
  "status" : 201
}, {
  "id" : 3,
  "from" : "/node",
  "body" : {
    "extensions" : {
    },
    "paged_traverse" : "http://localhost:7474/db/data/node/133/paged/traverse/{returnType}{?pageSize,leaseTime}",
    "labels" : "http://localhost:7474/db/data/node/133/labels",
    "outgoing_relationships" : "http://localhost:7474/db/data/node/133/relationships/out",
    "traverse" : "http://localhost:7474/db/data/node/133/traverse/{returnType}",
    "all_typed_relationships" : "http://localhost:7474/db/data/node/133/relationships/all/{-list|&|types}",
    "all_relationships" : "http://localhost:7474/db/data/node/133/relationships/all",
    "property" : "http://localhost:7474/db/data/node/133/properties/{key}",
    "self" : "http://localhost:7474/db/data/node/133",
    "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/133/relationships/out/{-list|&|types}",
    "properties" : "http://localhost:7474/db/data/node/133/properties",
    "incoming_relationships" : "http://localhost:7474/db/data/node/133/relationships/in",
    "incoming_typed_relationships" : "http://localhost:7474/db/data/node/133/relationships/in/{-list|&|types}",
    "create_relationship" : "http://localhost:7474/db/data/node/133/relationships",
    "data" : {
      "age" : 1
    }
  },
  "location" : "http://localhost:7474/db/data/node/133",
  "status" : 201
} ]