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

问题描述:

我看到了嵌入式Neo4j的一些相当不可能的性能结果,表面上它的速度比预期的要慢几个数量级,所以我假设我在做“错误的“,尽管我没有做任何复杂的事情。Neo4j慢?我一定在做错什么,请告诉我它是什么

我使用Neo4j的

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

我创建了假冒产品1500与简单的属性最新的嵌入式Python绑定(https://github.com/neo4j/python-embedded):

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

...和创建的节点了出来,我连接到subreference节点:

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 

......通过这些节点1500迭代花费> 0.2秒对我的MacBook Pro。什么。 (编辑:当然,我跑这个查询一堆时间,以便至少在python绑定它不是冷缓存的问题)

我陶醉它到15K,花了2秒。我下载的Gremlin并发出等效的查询,调查,如果它的Neo4j或Python绑定:

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

..它似乎花了大约2秒的第一次尝试,在第二次运行它似乎几乎立即完成。

任何想法为什么它如此缓慢?我得到的结果在我看来是一种错误。

这是Neo4j懒洋洋地加载数据,没有做任何预取。在第一次运行时,您正在碰到磁盘,第二次,缓存变暖,这是您的真实生产场景。

+0

感谢您的答案彼得,我假设我创建和连接数据的方式是好的? 但是关于你的答案 - 这不是我在Python绑定结果中看到的 - 至少上面的遍历连续多次都会花费相同的时间。 – Wojtek 2012-02-03 15:27:17

+0

那么,在gremlin/groovy/java这块土地上它速度很快,但不是通过Python? – 2012-02-04 14:49:42

+0

唉,试图在OSX Lion上安装JPype没有成功,希望重现它:/ – 2012-02-05 16:06:00