It already does optimistic locking by checking properties if they have been change by someone else in between (for reattach of advanced mapping entities at least).
Otherwise you can still use locking like this:
@Override
public void doSomething(....) {
Node lockNode = ... (use-case specific granularity, e.g. template.getReferenceNode()
try {
lock(lockNode);
... business - code
} finally {
unlock(lockNode);
}
}
private void lock(Node node) {
LockManager lockManager = graphDatabaseAPI.getLockManager();
lockManager.getWriteLock(node);
}
private void unlock(Node node) {
try {
LockManager lockManager = graphDatabaseAPI.getLockManager();
lockManager.releaseWriteLock(node, graphDatabaseAPI.getTxManager().getTransaction());
} catch (SystemException e) {
throw new RuntimeException(e);