There is no way to improve performance of that query thru Cypher.
You can try to avoid Nodes without fatherName property
MATCH (p:Person)
WHERE HAS (p.fatherName)
REMOVE p.fatherName
Also what could help is to add LIMIT and run query multipletimes
MATCH (p:Person)
WHERE HAS (p.fatherName)
WITH p LIMIT 100000
REMOVE p.fatherName
I suggest you to write Unmanaged Extension for removing that property.
e.g.
Label nodeLabel = DynamicLabel.label("Person");
String propertyName = "fatherName";
try(Transaction tx = database.beginTx()) {
final ResourceIterator<Node> people = database.findNodes(nodeLabel);
for (Node person : IteratorUtil.asCollection(people)) {
if (person.hasProperty(propertyName)) {
person.removeProperty(propertyName);
}
}
tx.success();
}