Atomic { @Procedure(mode = Mode.WRITE) @Description("apoc.atomic.concat(node/relatonship,propertyName,string) Concats the property's value with the 'string' value") public Stream<AtomicResults> concat(@Name("container") Object container, @Name("propertyName") String property, @Name("string") String string, @Name(value = "times", defaultValue = "5") Long times) { checkIsEntity(container); Entity entity = Util.rebind(tx, (Entity) container); final String[] newValue = new String[1]; final String[] oldValue = new String[1]; final ExecutionContext executionContext = new ExecutionContext(tx, entity, property); retry(executionContext, (context) -> { oldValue[0] = entity.getProperty(property).toString(); newValue[0] = oldValue[0].concat(string); entity.setProperty(property, newValue[0]); return context.entity.getProperty(property); }, times); return Stream.of(new AtomicResults(entity, property, oldValue[0], newValue[0])); }  @Procedure(mode = Mode.WRITE) @Description("apoc.atomic.add(node/relatonship,propertyName,number) Sums the property's value with the 'number' value ") Stream<AtomicResults> add(@Name("container") Object container, @Name("propertyName") String property, @Name("number") Number number, @Name(value = "times", defaultValue = "5") Long times); @Procedure(mode = Mode.WRITE) @Description("apoc.atomic.subtract(node/relatonship,propertyName,number) Subtracts the 'number' value to the property's value") Stream<AtomicResults> subtract(@Name("container") Object container, @Name("propertyName") String property, @Name("number") Number number, @Name(value = "times", defaultValue = "5") Long times); @Procedure(mode = Mode.WRITE) @Description("apoc.atomic.concat(node/relatonship,propertyName,string) Concats the property's value with the 'string' value") Stream<AtomicResults> concat(@Name("container") Object container, @Name("propertyName") String property, @Name("string") String string, @Name(value = "times", defaultValue = "5") Long times); @Procedure(mode = Mode.WRITE) @Description("apoc.atomic.insert(node/relatonship,propertyName,position,value) insert a value into the property's array value at 'position'") Stream<AtomicResults> insert(@Name("container") Object container, @Name("propertyName") String property, @Name("position") Long position, @Name("value") Object value, @Name(value = "times", defaultValue = "5") Long times); @Procedure(mode = Mode.WRITE) @Description("apoc.atomic.remove(node/relatonship,propertyName,position) remove the element at position 'position'") Stream<AtomicResults> remove(@Name("container") Object container, @Name("propertyName") String property, @Name("position") Long position, @Name(value = "times", defaultValue = "5") Long times); @Procedure(mode = Mode.WRITE) @Description("apoc.atomic.update(node/relatonship,propertyName,updateOperation) update a property's value with a cypher operation (ex. \"n.prop1+n.prop2\")") Stream<AtomicResults> update(@Name("container") Object nodeOrRelationship, @Name("propertyName") String property, @Name("operation") String operation, @Name(value = "times", defaultValue = "5") Long times); @Context
    public GraphDatabaseService db; @Context
    public Transaction tx; }
@Test public void testConcat(){ db.executeTransactionally("CREATE (p:Person {name:'Tom',age: 35})"); testCall(db, "MATCH (n:Person {name:'Tom'}) CALL apoc.atomic.concat(n,$property,$value,$times) YIELD container RETURN count(*)",map("property","name","value","asson","times",5), (r) -> {}); long age = TestUtil.singleResultFirstColumn(db, "MATCH (n:Person {name:'Tomasson'}) RETURN n.age as age;"); assertEquals(35L, age); }