这似乎是一个非常奇怪的问题。我正在对我的 neo4j 图形数据库进行压力测试,因此我的一项测试需要创建大量用户(在此特定测试中为 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 个用户。我在调试器中跟踪并观察作为第二个节点的 dataService.getUser(BigInteger.valueOf(1)) 的值、作为第 128 个节点的 dataService.getUser(BigInteger.valueOf(127)) 和 dataService 的值。 getUser(BigInteger.valueOf(i-1)) 这是创建的最后一个节点。调试器告诉我,在创建节点 128 后,不会创建节点 129 及更高版本,因为 getUser() 为这些节点抛出了 DoesNotExistException,但仍然为节点 2 和节点 128 提供了值。
我传递给 createUser() 的用户 ID 是自动索引的。
知道为什么它不制作更多节点(或不索引这些节点)吗?