【发布时间】:2012-02-03 14:38:43
【问题描述】:
我看到嵌入式 Neo4j 的一些相当不可能的性能结果,从表面上看,它比预期的要慢几个数量级,所以我假设我“做错了”,尽管我没有做任何复杂的事情。
我正在为 Neo4j 使用最新的嵌入式 python 绑定 (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,花了 2s。我下载了 Gremlin 并发出了一个等效的查询来调查它是 neo4j 还是 python 绑定:
g.v(1).in("INSTANCE_OF")
..第一次尝试似乎花了大约 2 秒,第二次运行似乎几乎立即完成。
知道为什么这么慢吗?我得到的结果一定是我犯了某种错误。
【问题讨论】:
标签: python performance neo4j