As pointed by @RaduK, neo4j sets the id of the node itself and does not allows the user to override this behaviour. Maybe something that they might do in future. However, if you are considering to use the neo4j generated id in your system, neo4j issued a warning on their page.
A node's id is unique, but note the following: Neo4j reuses its
internal ids when nodes and relationships are deleted, which means
it's bad practice to refer to them this way. Instead, use application
generated ids.
So don't use the neo4j's id in your system.
That being said, you are mostly concerned about the fact that using property every time will result in delays. With Neo4J 2.x, they give you the option to set an index on your property so that the traversal is fast. Here is how you do that. Inside your code where you have the object of GraphDatabaseService, insert this piece of code:
try(Transaction transaction = graphDatabaseService.beginTx())
{
Schema schema = graphDatabaseService.schema();
schema.indexFor(DynamicLabel.label("User")).on("internal_id").create();
transaction.success();
}
This code will tell neo4j that from now on, you have to make and maintain index on all nodes that are of type "User" on the property "internal_id".
Moreover, neo4j has an internal caching system which people usually refer to as warm cache. It means that your query will only take time the first time it runs. From then onwards, if you try the same query repeatedly, the query will be blazing fast.