Neo4j lento? Debo estar haciendo algo mal, por favor dime que es

Estoy viendo algunos resultados de rendimiento bastante improbables con el Neo4j integrado, en la superficie son órdenes de magnitud más lentas de lo esperado, así que asumo que estoy “haciendo mal”, aunque no estoy haciendo nada complicado.

Estoy usando los últimos enlaces Python incrustados para Neo4j (https://github.com/neo4j/python-embedded)

from neo4j import GraphDatabase db = GraphDatabase('/tmp/neo4j') 

He creado productos 1500 falsos con atributos simples:

 fake_products = [{'name':str(x)} for x in range(0,1500)] 

… y creé nodos fuera de ellos que conecté con un nodo de subreferencia:

 with db.transaction: products = db.node() db.reference_node.PRODUCTS(products) for prod_def in fake_products: product = db.node(name=prod_def['name']) product.INSTANCE_OF(products) 

Ahora con lo que parece, para mí, como casi exactamente el mismo tipo de código que he visto en la documentación:

 PRODUCTS = db.getNodeById(1) for x in PRODUCTS.INSTANCE_OF.incoming: pass 

… iterando a través de estos 1500 nodos toma> 0.2s en mi Macbook Pro. QUÉ. (EDIT: Por supuesto que ejecuté esta consulta un montón de veces, así que al menos en los enlaces de python no es una cuestión de cachés fríos)

Lo amplifiqué hasta 15k, me tomó 2s. Descargué Gremlin y emití una consulta equivalente para investigar si es neo4j o los enlaces de python:

 gv(1).in("INSTANCE_OF") 

.. parece que tomó aproximadamente 2 segundos en el primer bash, en el segundo bash pareció completarse casi de inmediato.

¿Alguna idea de por qué es tan lento? Los resultados que estoy obteniendo tienen que ser algún tipo de error por mi parte.

Esto es Neo4j cargando datos perezosamente y no está haciendo ninguna búsqueda previa. En la primera ejecución, estás golpeando el disco, en la segunda, los cachés son cálidos, que es tu escenario de producción real.