При написании базовых тестовых примеров Neo4j для простых отношений один из моих тестовых примеров не прошел после изменения оператора (ов) CREATE. Единственное отличие в результате было в том, что идентификатор конечного узла был изменен с 1 на 20.
В интересах понимания, почему я должен спросить:
Как идентификаторы узлов назначаются в Neo4j?
Мне известно: ( GitHub )
* 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.
Эти операторы приводят к идентификатору конечного узла для отношения 20
.
CREATE (n:Person { name:'John' }) RETURN COUNT(*)
CREATE (n:Person { name:'Mary' }) RETURN COUNT(*)
MATCH (a:Person),(b:Person)
WHERE a.name = 'John'
AND b.name = 'Mary'
CREATE (a)-[r:relationship_type]->(b)
RETURN COUNT(*)
В результате этого оператора идентификатор конечного узла для отношения будет 1
.
CREATE (a:Person { name:'John' })-[r:relationship_type]->(b:Person { name:'Mary' }) RETURN COUNT(*)
EDIT
После рассмотрения record_id_batch_size из этого ответа и поиска связанного теста я попробовал этот тест, который, как я думал, увеличит идентификаторы на 2 вместо 1, так как есть три разные транзакции, которые я ожидал, что каждая транзакция запускает новый пакет идентификаторов на основе record_id_batch_size
.
@Test
public void idBatchSize02MultipleTransactions() throws Throwable {
try (ServerControls server = TestServerBuilders.newInProcessBuilder()
.withConfig(GraphDatabaseSettings.record_id_batch_size, "2")
.newServer()) {
GraphDatabaseService graph = server.graph();
Node node_001;
Node node_002;
Node node_003;
try (Transaction tx = graph.beginTx()) {
node_001 = graph.createNode();
tx.success();
}
try (Transaction tx = graph.beginTx()) {
node_002 = graph.createNode();
tx.success();
}
try (Transaction tx = graph.beginTx()) {
node_003 = graph.createNode();
tx.success();
}
assertEquals(0L,node_001.getId());
assertEquals(2L,node_002.getId());
assertEquals(4L,node_003.getId());
}
}
Однако тест не пройден, потому что идентификаторы действительно 0L
, 1L
, 2L
, а не 0L
, 2L
и 4L
. Придется больше читать.