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懒洋洋地加载数据,没有做任何预取。在第一次运行时,您正在碰到磁盘,第二次,缓存变暖,这是您的真实生产场景。
感谢您的答案彼得,我假设我创建和连接数据的方式是好的? 但是关于你的答案 - 这不是我在Python绑定结果中看到的 - 至少上面的遍历连续多次都会花费相同的时间。 – Wojtek 2012-02-03 15:27:17
那么,在gremlin/groovy/java这块土地上它速度很快,但不是通过Python? – 2012-02-04 14:49:42
唉,试图在OSX Lion上安装JPype没有成功,希望重现它:/ – 2012-02-05 16:06:00