Как идентификаторы узлов назначаются в Neo4j? - PullRequest
0 голосов
/ 05 ноября 2018

При написании базовых тестовых примеров 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. Придется больше читать.

1 Ответ

0 голосов
/ 05 ноября 2018

Узел id зависит от того, что вы ранее создали в своей базе данных. Это в основном автоинкремент, за исключением некоторых случаев (например, когда мы повторно используем идентификаторы, кластер, ...)

Итак, как вы проводите тест? У вас есть набор тестов, и между каждым тестом вы запускаете новый экземпляр базы данных, или вы удаляете базу данных?

Кроме того, для каждой транзакции Neo4j резервировал партию бесплатного идентификатора: https://github.com/neo4j/neo4j/blob/da3a460a7e4481534a8e19b73b0c2c6ede973ae8/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java#L794-L803

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...