これは非常に奇妙な問題のようです。私はneo4jグラフデータベースのストレステストを行っているので、私のテストの1つでは、多数のユーザーを作成する必要があります(この特定のテストでは、1000)。したがって、そのためのコードは次のとおりです。
// Creates a n users and measures the time taken to add another
n = 1000;
tx = graphDb.beginTx();
try {
for(int i = 0; i < n; i++){
dataService.createUser(BigInteger.valueOf(i));
}
start = System.nanoTime();
dataService.createUser(BigInteger.valueOf(n));
end = System.nanoTime();
time = end - start;
System.out.println("The time taken for createUser with " + n + " users is " + time +" nanoseconds.");
tx.success();
}
finally
{
tx.finish();
}
そして、dataService.createUser()のコードは次のとおりです。
public User createUser(BigInteger identifier) throws ExistsException {
// Verify that user doesn't already exist.
if (this.nodeIndex.get(UserWrapper.KEY_IDENTIFIER, identifier)
.getSingle() != null) {
throw new ExistsException("User with identifier '"
+ identifier.toString() + "' already exists.");
}
// Create new user.
final Node userNode = graphDb.createNode();
final User user = new UserWrapper(userNode);
user.setIdentifier(identifier);
userParent.getNode().createRelationshipTo(userNode, NodeRelationships.PARENT);
return user;
}
これらのユーザーを作成した後、dataService.getUser()を呼び出す必要があります。getUser()のコードは次のとおりです。
public User getUser(BigInteger identifier) throws DoesNotExistException {
// Search for the user.
Node userNode = this.nodeIndex.get(UserWrapper.KEY_IDENTIFIER,
identifier).getSingle();
// Return the wrapped user, if found.
if (userNode != null) {
return new UserWrapper(userNode);
} else {
throw new DoesNotExistException("User with identifier '"
+ identifier.toString() + "' was not found.");
}
}
したがって、129番目のユーザーを作成するまで、すべてが順調に進んでいます。デバッガーをフォローして、2番目のノードであるdataService.getUser(BigInteger.valueOf(1))、128番目のノードであるdataService.getUser(BigInteger.valueOf(127))、およびdataServiceの値を監視しています。最後に作成されたノードであるgetUser(BigInteger.valueOf(i-1))。また、デバッガーは、ノード128が作成された後、getUser()がそれらのノードに対してDoesNotExistExceptionをスローするため、ノード129以上は作成されないが、ノード2とノード128の値を提供することを通知します。
createUser()に渡すユーザーIDは自動インデックス付けされます。
より多くのノードを作成しない(またはこれらのノードにインデックスを付けない)理由はありますか?