starter star springboot proyecto initializr create crear spring neo4j spring-data-neo4j

spring - star - ¿Por qué la velocidad del inserto de neo4j es tan baja en este ejemplo?



spring project (1)

Una llamada a save() es en realidad una solicitud de persitencia directa en contra de la base de datos. Actualmente no existe la noción de diferir las llamadas a save ().

Al activar el registro de consultas al agregar un archivo logback-test.xml a sus recursos de prueba:

<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d %5p %40.40c:%4L - %m%n</pattern> </encoder> </appender> <logger name="org.neo4j.ogm" level="info" /> <root level="info"> <appender-ref ref="console" /> </root> </configuration>

Puedes ver que para cada Person.save() realmente hará 3 solicitudes:

  • 1 para guardar los objetos del coche
  • 1 para guardar el objeto Persona
  • 1 para crear las relaciones

-

2016-07-25 05:27:51,093 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row CREATE (n:`Car`) SET n=row.props RETURN row.nodeRef as nodeRef, ID(n) as nodeId with params {rows=[{nodeRef=-590487524, props={type=f27dc1bac12a480}}, {nodeRef=-1760792732, props={type=41ff5d3a69b4a5b4}}, {nodeRef=-637840556, props={type=3e7e77ca5e406a21}}]} 2016-07-25 05:27:54,117 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row CREATE (n:`Person`) SET n=row.props RETURN row.nodeRef as nodeRef, ID(n) as nodeId with params {rows=[{nodeRef=-1446435394, props={name=bafd7ad2721516f8}}]} 2016-07-25 05:27:54,178 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row MATCH (startNode) WHERE ID(startNode) = row.startNodeId MATCH (endNode) WHERE ID(endNode) = row.endNodeId MERGE (startNode)-[rel:`HAS`]->(endNode) RETURN row.relRef as relRefId, ID(rel) as relId with params {rows=[{startNodeId=3, relRef=-712176789, endNodeId=0}, {startNodeId=3, relRef=-821487247, endNodeId=1}, {startNodeId=3, relRef=-31523689, endNodeId=2}]}

El rendimiento sería mejor si, en cambio, la declaración para la creación de la persona simplemente utilizara como parámetro las 100 personas a la vez, y lo mismo para los objetos del automóvil.

A partir de ahora no existe una función nativa lista para usar en el OGM (número abierto: https://github.com/neo4j/neo4j-ogm/issues/208

Sin embargo, puede agruparlos saving una colección en lugar de uno por uno:

@Test @DirtiesContext public void speedTest2() { SessionFactory sessionFactory = new SessionFactory("hello.neo.domain"); Session session = sessionFactory.openSession(); Random rand = new Random(10); System.out.println("Before linking up with Neo4j..."); long start = System.currentTimeMillis(); long mark = start; for (int j = 0; j < 10; j++) { List<Person> batch = new ArrayList<>(); for (int i = 0; i < 100; i++) { Person greg = new Person(rand); batch.add(greg); } session.save(batch); long now = System.currentTimeMillis(); System.out.format("%d : Time:%d/n", j, now - mark); mark = now; } }

Puedes ver que la diferencia de resultados es muy impresionante:

Not initialzing DB. Before linking up with Neo4j... 0 : Time:7318 1 : Time:1731 2 : Time:1555 3 : Time:1481 4 : Time:1237 5 : Time:1176 6 : Time:1101 7 : Time:1094 8 : Time:1114 9 : Time:1015 Not initialzing DB. Before linking up with Neo4j... 0 : Time:494 1 : Time:272 2 : Time:230 3 : Time:442 4 : Time:320 5 : Time:247 6 : Time:284 7 : Time:288 8 : Time:366 9 : Time:222

Quería probar la velocidad de inserción con los últimos datos de primavera neo4j 4. Modifiqué el ejemplo de las películas para hacer las cosas simples y comparables.

Intenta ejecutar la clase de prueba: movies.spring.data.neo4j.repositories.PersonRepositoryTest aquí.

Se necesitan 5 segundos para agregar 400 nodos en este ejemplo. https://github.com/fodon/neo4j-spring-data-speed-demo

Esta es una prueba de velocidad con la versión anterior de neo4j https://github.com/fodon/gs-accessing-data-neo4j-speed

La clase hello.Application es aproximadamente 40 veces más rápida que spring-data-neo4j-4 para el mismo trabajo.

¿Por qué spring-data-neo4j-4 es más lento que la versión anterior? ¿Cómo se puede acelerar?