Neo4j慢?我肯定做错了什么,请告诉我是什么

3 投票
1 回答
1379 浏览
提问于 2025-04-17 12:15

我在使用嵌入式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绑定中,这并不是冷缓存的问题)

我把数量增加到15000个,结果花了2秒。我下载了Gremlin,并发出了一个等效的查询,想看看是Neo4j的问题还是Python绑定的问题:

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

... 第一次运行似乎也花了大约2秒,但第二次运行几乎立刻就完成了。

你知道为什么这么慢吗?我得到的结果肯定是我哪里搞错了。

1 个回答

1

这是在说Neo4j这个数据库是怎么懒加载数据的,也就是说它不会提前把数据都加载进来。在第一次运行的时候,它需要从硬盘读取数据,而在第二次运行时,数据已经被缓存了,这样就能更快地访问,这才是你在实际生产环境中会遇到的情况。

撰写回答