El rendimiento de neo4j en comparación con mysql (¿cómo puede mejorarse?)

Este es un seguimiento para no poder reproducir / verificar las afirmaciones de rendimiento en bases de datos de gráficos y neo4j en los libros de acción . He actualizado la configuración y las pruebas, y no quiero cambiar demasiado la pregunta original.

La historia completa (incluidos los scripts, etc.) se encuentra en https://baach.de/Members/jhb/neo4j-performance-compared-to-mysql

Versión corta: al intentar verificar las afirmaciones de rendimiento realizadas en el libro ‘Base de datos de gráficos’, obtuve los siguientes resultados (consultando un conjunto de datos aleatorio que contiene n personas, con 50 amigos cada una):

My results for 100k people depth neo4j mysql python 1 0.010 0.000 0.000 2 0.018 0.001 0.000 3 0.538 0.072 0.009 4 22.544 3.600 0.330 5 1269.942 180.143 0.758 

“*”: ejecución única

 My results for 1 million people depth neo4j mysql python 1 0.010 0.000 0.000 2 0.018 0.002 0.000 3 0.689 0.082 0.012 4 30.057 5.598 1.079 5 1441.397* 300.000 9.791 

“*”: ejecución única

Usando 1.9.2 en una ubuntu de 64 bits, he configurado neo4j.properties con estos valores:

 neostore.nodestore.db.mapped_memory=250M neostore.relationshipstore.db.mapped_memory=2048M 

y neo4j-wrapper.conf con:

 wrapper.java.initmemory=1024 wrapper.java.maxmemory=8192 

Mi consulta a neo4j tiene este aspecto (utilizando la API REST):

 start person=node:node_auto_index(noscenda_name="person123") match (person)-[:friend]->()-[:friend]->(friend) return count(distinct friend); 

Node_auto_index está en su lugar, obviamente

¿Hay algo que pueda hacer para acelerar neo4j (para ser más rápido que mysql)?

Y también hay otro punto de referencia en Stackoverflow con el mismo problema.

Siento que no puedas reproducir los resultados. Sin embargo, en una MacBook Air (1.8 GHz i7, 4 GB RAM) con un montón de 2 GB, caché GCR, pero sin calentamiento de cachés, y sin otra sintonización, con un conjunto de datos de tamaño similar (1 millón de usuarios, 50 amigos por persona) , Repetidamente obtengo aproximadamente 900 ms utilizando Traversal Framework en 1.9.2:

 public class FriendOfAFriendDepth4 { private static final TraversalDescription traversalDescription = Traversal.description() .depthFirst() .uniqueness( Uniqueness.NODE_GLOBAL ) .relationships( withName( "FRIEND" ), Direction.OUTGOING ) .evaluator( new Evaluator() { @Override public Evaluation evaluate( Path path ) { if ( path.length() >= 4 ) { return Evaluation.INCLUDE_AND_PRUNE; } return Evaluation.EXCLUDE_AND_CONTINUE; } } ); private final Index userIndex; public FriendOfAFriendDepth4( GraphDatabaseService db ) { this.userIndex = db.index().forNodes( "user" ); } public Iterator getFriends( String name ) { return traversalDescription.traverse( userIndex.get( "name", name ).getSingle() ) .iterator(); } public int countFriends( String name ) { return count( traversalDescription.traverse( userIndex.get( "name", name ).getSingle() ) .nodes().iterator() ); } } 

Cypher es más lento, pero en ningún caso es tan lento como sugiere: aproximadamente 3 segundos:

 START person=node:user(name={name}) MATCH (person)-[:FRIEND]->()-[:FRIEND]->()-[:FRIEND]->()-[:FRIEND]->(friend) RETURN count(friend) 

Saludos cordiales

ian

Sí, creo que la API REST es significativamente más lenta que los enlaces regulares y ahí reside su problema de rendimiento.