Neo4j慢吗?我一定做错了,请告诉我它是什么

时间:2012-02-03 14:38:44

标签: python performance neo4j

我看到嵌入式Neo4j的一些相当不可能的性能结果,表面上它比预期慢了几个数量级,所以我假设我“做错了”,虽然我没有做任何复杂的事情。

我正在使用最新的嵌入式python绑定Neo4j(https://github.com/neo4j/python-embedded)

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

我创建了具有简单属性的假1500产品:

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

...并创建了我连接到子引用节点的节点:

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)

现在看看我的内容,就像我在文档中看到的几乎完全相同的代码一样:

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

...在我的Macbook Pro上迭代这1500个节点需要大于0.2秒。什么。 (编辑:我当然经常运行这个查询,所以至少在python绑定中它不是冷缓存的问题)

我将它增加到15k,耗时2秒。我下载了Gremlin并发出了一个等效的查询来调查它是neo4j还是python绑定:

g.v(1).in("INSTANCE_OF")

..第一次尝试时似乎需要2s左右,第二次运行似乎几乎立即完成。

知道为什么这么慢吗?我得到的结果必须是我的某种错误。

1 个答案:

答案 0 :(得分:1)

这是Neo4j懒惰地加载数据而没有进行任何预取。在第一次运行时,您正在访问磁盘,在第二次运行时,缓存是温暖的,这是您真正的生产场景。