我看到嵌入式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左右,第二次运行似乎几乎立即完成。
知道为什么这么慢吗?我得到的结果必须是我的某种错误。
答案 0 :(得分:1)
这是Neo4j懒惰地加载数据而没有进行任何预取。在第一次运行时,您正在访问磁盘,在第二次运行时,缓存是温暖的,这是您真正的生产场景。